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

C++ enable_if is_member_function_pointer call depending on existence of member function

在草草浏览了多个线程(例如这个线程)之后

没有找到解决方案,我在这里发布我的问题。对于一个微型记录器 class,我想监视使用 << 运算符记录的数据量。例如,当一个字符串过时或一个具有 .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);
}

Addendumg/Edit:以下要么不适用于 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);
}

你定义了两次

template<typename T, typename> size_t getSize(const T &p_rObj);

而你忘记了 ::type 并且你的特征与 SFINAE 不兼容

可以实现的特征:

template <typename T> auto has_size_impl(int) -> decltype(std::declval<T>().size(), std::true_type{});
template <typename T> auto has_size_impl(...) -> std::false_type;

template <typename T>
using has_size = decltype(has_size_impl<T>(0));

您必须在 return 类型、模板参数或常规参数中使用 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