模板检查是否存在超载成员功能
template to check for existence of overloaded member function
我尝试使用类似的特殊成员函数(在另一个示例中找到):
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();
};
如何重写我的测试代码以从模板中获取"是"?
必须将无参数的过载函数名称使用(13.4p1)解析为单个重载(13.4p4),否则将发生替换失败。
如果您正在测试成员函数的存在,那么您应该知道打算与之调用的参数:
template <typename C> static one test(
typename std::add_pointer<decltype(std::declval<C>().AnyFunc())>::type);
通常,您可以使用variadic模板和类似于 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
)一起使用。
找到了有效的版本:
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);
};
相关文章:
- 超载类成员功能标记为const
- 如果类仅通过要求启用单个成员函数,仍然可以模棱两可地超载
- 找不到超载的成员功能,类位于标题中
- 如何使用模板函数参数编写包装函数,该功能可以采用超载的成员函数
- 模板成员超载的Sfinae
- 是否可以将成员超载存储在容器中
- 覆盖复制/移动分配超载时,我是否需要删除当前的成员数据
- 朋友超载的派生类和基本成员访问的运营商
- C 获得超载成员功能指针的通用方法
- 如果功能超载,则BOOST PHOENIX成员功能操作员无法编译
- 成员是私人,运营商在C 中超载
- C 垃圾成员值时使用公共和私人超载构造函数
- C 将操作员作为类成员超载
- 如何从类的实例中超载成员函数
- 铸造助手用于超载成员功能指针
- 成员初始化超载构造函数
- 从模板类中的Bool值超载成员
- 模板检查是否存在超载成员功能
- 从班级外部超载成员功能
- 运算符超载:成员与非会员当仅涉及相同类型的对象时