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);
在草草浏览了多个线程(例如这个线程)之后
没有找到解决方案,我在这里发布我的问题。对于一个微型记录器 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);