C ++ enable_if is_member_function_pointer调用取决于成员函数的存在

时间:2016-04-20 08:24:51

标签: c++ member enable-if

在潦草地浏览了几个这样的线程之后

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);
}

1 个答案:

答案 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);

Demo