如果一个类有一个像这样的特殊成员函数(在另一个例子中找到),我会尝试专门化一个模板:
template <typename T>
class has_begin
{
typedef char one;
typedef long two;
template <typename C> static one test( decltype( &C::AnyFunc) ) ;
template <typename C> static two test(...);
public:
enum { value = sizeof(test<T>(0)) == sizeof(char) };
enum { Yes = sizeof(has_begin<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};
这很有效,直到AnyFunc
重载:
class B : public vector<int>
{
public:
void AnyFunc() const;
void AnyFunc();
};
如何从我的模板中重写我的测试代码以获得“是”?
答案 0 :(得分:2)
必须将使用不带参数的重载函数名称(13.4p1)解析为单个重载(13.4p4),否则将发生替换失败。
如果您正在测试是否存在成员函数,那么您应该知道您打算用它调用的参数:
template <typename C> static one test(
typename std::add_pointer<decltype(std::declval<C>().AnyFunc())>::type);
通常,您可以使用可变参数模板和类似于result_of
的模式:
template <typename C, typename... Args> static one test(
typename std::add_pointer<decltype(
std::declval<C>(std::declval<Args>()...).AnyFunc())>::type);
使用add_pointer
允许它使用不允许作为函数参数类型的函数返回类型(例如void
)。
答案 1 :(得分:1)
找到有效的版本:
template <typename C> static one test( decltype(((C*)0)->AnyFunc())* ) ;
如果要验证该对象是否具有const函数,请使用:
template <typename C> static one test( decltype(((const C*)0)->AnyFunc())* ) ;
此版本不会检测带参数的函数:
class B : public std::vector<int>
{
public:
//void AnyFunc() const;
//void AnyFunc();
int AnyFunc(int);
};