C ++ 0x函数删除 - 删除除特定类型以外的所有类型

时间:2011-06-05 15:50:33

标签: c++11 c-strings delete-operator unicode-string

在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类型之一的类型,但我仍然希望获得函数模板的好处,这允许我概括类型并避免重复代码。

解决此问题的最佳方法是什么?有可能吗?

3 个答案:

答案 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
}