【发布时间】:2011-10-26 11:48:30
【问题描述】:
我正在做一些元编程,现在我需要测试给定类型的成员函数是否可以使用给定的一组参数调用,所以我正在做类似以下的事情(通过删除所有内容大大简化了当然对于这个特定问题并不重要):
template<typename T, typename... Args>
struct argument_tester {
struct base: public T {
using T::my_member;
no my_member(...){}
};
typedef decltype(static_cast<base*>(0)->my_member(*static_cast<Args*...>(0))) type;
//verify return type
};
当然它不适用于*static_cast<Args*...>(0),所以我的问题是是否有任何方法可以将参数包解压缩为取消引用的空指针,或者如果这是我必须专门针对每个参数数量的情况。当然,如果有办法我会怎么做?我正在使用gcc 4.6,以防万一这对可能和不可能产生影响。
【问题讨论】:
-
你知道
std::declval吗? -
@R。 Martinho Fernandes:我没有,但这对这种情况有什么影响
-
有一个错误,我认为,在这段代码中,
base未被使用,我认为它是用来代替T中的static_cast<T*>(0)。 -
@Grizzly:不多,但您不需要使用静态强制转换和取消引用空指针。只是让人们了解新工具:)
-
使用
std::declval使代码更加简洁(对于一个),并且使您能够将T&指定为参数。目前,如果参数参数之一是T&,那么T&*将失败...
标签: c++ templates metaprogramming c++11