SFINAE for detecting existence of non-member template function
没有找到解决方案,我在这里发布我的问题。对于一个很小的记录器类,我想监视使用<<<<<<<运营商。例如,当一个字符串是passe或一个具有.size()成员函数的数组时,我想将size()字节数添加到该数量,否则为sizeof(...)。
我如何(使用具有非常稀疏的C ++ 11支持的VS 2010)使用std :: enable_if和std :: is_member_function_pointer来实现我的目标?例如,我如何定义一个按需运行的函数getSize()?
下面的代码表明我想要的,但我想我无法定义两次getSize ......
非常感谢您的帮助!
template<typename T,
typename = typename std::enable_if<std::is_member_function_pointer<decltype(&T::size)>::value>
>
size_t getSize(const T &p_rObj)
{
return p_rObj.size();
}
template<typename T,
typename = typename std::enable_if<!std::is_member_function_pointer<decltype(&T::size)>::value>
>
size_t getSize(const T &p_rObj)
{
return sizeof(p_rObj);
}
附录/编辑:以下任一项都不适用于VS 2010,后者希望每次调用getSize(...)都有两个参数......
template<typename T>
size_t getSize(std::enable_if<std::is_member_function_pointer<decltype(&T::size)>::value>, const T &p_rObj)
{
return p_rObj.size();
}
template<typename T>
size_t getSize(std::enable_if<!std::is_member_function_pointer<decltype(&T::size)>::value>, const T &p_rObj)
{
return sizeof(p_rObj);
}
答案 0 :(得分:0)
你定义了两次
template<typename T, typename> size_t getSize(const T &p_rObj);
你忘了::type
而且你的特质不是SFINAE兼容的
您必须在返回类型,模板参数或常规参数中使用std::enable_if
:
template<typename T>
typename std::enable_if<has_size<T>::value, std::size_t>::type
getSize(const T &p_rObj);
或
template<typename T,
typename std::enable_if<has_size<T>::value>::type* = nullptr>
std::size_t getSize(const T &p_rObj);
或
template<typename T>
std::size_t getSize(const T &p_rObj,
typename std::enable_if<has_size<T>::value>::type* = nullptr);