【发布时间】:2018-07-16 19:39:23
【问题描述】:
我需要一种简单的方法来获取T 类对象的计数/长度/大小,其中T 是某种集合类型,例如std::map、std::list、std::vector、 CStringArray,CString,std::string,……
对于大多数标准类型,T::size() 是正确答案,对于大多数 MFC 类,T::GetSize() 是正确答案,对于 CString,它是 T::GetLength()。
我想点个赞:
template <typename T> auto size(const T & t)
...计算出正确的成员函数调用。
似乎应该有一种简单的方法来调用 T 上的特征模板,该模板有一个 size(const T & t) 成员,它本身使用 SFINAE 存在或不存在,如果它存在,那么根据定义调用一个适当的t.size_function() 以返回该T 实例中的元素计数。
我可以编写一个精心设计的has_member 类型特征模板——stackoverflow 上有几个例子——所有这些都非常复杂,因为在我看来“必须有一个更简单的方法”。使用 C++ 17,这个问题似乎应该可以轻松优雅地解决?
here 和 here 的这些讨论似乎使用了一个不优雅的解决方案,其中一些答案使用预处理器宏来完成工作。这还有必要吗?
但是...当然,必须有一种方法来使用这样一个事实,即在 T 上调用正确的成员函数是可编译的,而调用错误的成员函数无法编译 - 不能这样使用 直接为给定类型T创建正确的类型特征包装器?
我想要一些类似的东西:
template <typename T>
auto size(const T & collection)
{
return collection_traits<T>::count(collection);
}
选择 collection_traits<T> 的确切特化是因为它是唯一适合 T 的特化(即它调用正确的实例方法)。
【问题讨论】:
-
在 C++17 中,您可以使用 constexpr-if 来显着降低类型特征的复杂性。
-
@Holt - 感谢您的编辑。 GJ