的C++ 0x功能删除 - 删除所有,但某些类型的
问题描述:
在C++ 0x中,我可以做这样的事情:的C++ 0x功能删除 - 删除所有,但某些类型的
double f(double x) { return x; }
template<class T>
T f(T x) = delete;
为了防止f()
被称为上的任何其他类型的比double
。
我想要做的是类似的,但不完全相同。
我有一个函数在指针数组上运行。例如:
template<class T>
T* some_string_function(T* x);
我希望能够为char,char16_t和char32_t使T工作,但不是任何其他类型。我在想,C++ 0x的delete
将是一个很好的方法来实现这一点。基本上,我希望能够阻止这个函数使用任何不是三种Unicode char
类型之一的类型,但我仍然希望获得函数模板的优点,这些函数模板允许我概括类型并避免重复代码。
解决此问题的最佳方法是什么?可能吗?
答
你可以使用type_traits做到这一点:
template<typename T>
typename enable_if<is_same<char, T>::value || is_same<char16_t, T>::value || is_same<char32_t, T>::value, T*>::type some_string_function(T *x)
{
return x;
}
尽管如果你想允许的话,你也必须特别指定const。
答
我认为最好的方法是使用static_assert和is_same(都是C++ 0x功能)的组合。当你对函数进行无效调用时,这也允许更友好的错误消息。
#include <iostream>
using namespace std;
template<typename T> T* f(T*)
{
static_assert
(is_same<T, char>::value
|| is_same<T, char16_t>::value
|| is_same<T, char32_t>::value,
"Invalid Type, only char pointers allowed");
}
int main()
{
cout<<*f(new char('c'));//Compiles
cout<<*f(new int(3));//Error
}
如果你能''删除'函数模板,然后编写未删除的特化,那本来是很好的。但从我从FDIS中看到的情况来看,这是不可能的。 – 2011-06-05 20:25:19