在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);
我希望能够使T对char,char16_t和char32_t起作用,但不能使用任何其他类型。我当时认为C ++ 0x的delete
将是实现这一目标的好方法。基本上,我希望能够阻止此函数使用任何不属于三种Unicode char
类型之一的类型,但我仍然希望获得函数模板的好处,这允许我概括类型并避免重复代码。
解决此问题的最佳方法是什么?有可能吗?
答案 0 :(得分:3)
使用boost::enable_if
以及类型特征。
template<class T>
T* some_string_function(T* x, boost::enable_if<is_char_type<T>);
(假设is_char_type
是您定义的类型特征,对于所需类型评估为true,对所有其他类型评估为false
答案 1 :(得分:1)
您可以使用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。
答案 2 :(得分:0)
我认为最好的方法是使用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
}