【发布时间】:2014-06-17 08:16:27
【问题描述】:
我有一个带有重置方法的模板化数组类。我想优化重置代码以在 POD 上使用 memset,并在非 POD 上调用用户提供的 reset()。
我想要 (1) 方法名称相同 (reset) 并根据模板参数使用相关实现,以及 (2) 如果使用没有 reset() 函数的非 pod 类型 T 则编译时错误.
template <typename T>
class CArray {
private:
T* array;
size_t size;
public:
void reset() {
memset(array, 0, size);
}
void reset() {
for (size_t i=0; i<size; ++i)
array[i].reset();
}
}
CArray<int> arr1;
arr1.reset(); -> will use memset and be fast
struct t2 { int* mem; void reset() {} };
CArray<t2> arr2;
arr2.reset(); -> will call t2.reset for each element
struct t3 { int* mem; };
CArray<t3> arr3;
arr3.reset(); -> should fail compilation since t3.reset() is missing
我尝试使用 type_traits,但我不确定这是否是正确的方向(它对编译时检查有帮助吗)?
【问题讨论】:
-
boost 有一个
enable_if,某种 SFINAE on POD-ness maby? -
你可以在
std::is_pod<T>上使用SFINAE -
您可能想要“简单可复制”而不是 POD。不管怎样,C++14 有一系列有趣的模板,例如
is_pod、is_trivially_copyable等。实现留作练习等... -
与 user657267 的观点一致,即
memset可能等于或差于std::fill;另一种选择是通过 SFINAE 调用reset()(如果存在)和std::fill(如果不存在)。
标签: c++ templates metaprogramming typetraits