0

在 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++0xdelete将是实现这一目标的好方法。基本上,我希望能够防止此函数使用不是三种 Unicodechar类型之一的任何类型,但我仍然希望获得函数模板的好处,它允许我概括类型并避免重复代码。

解决这个问题的最佳方法是什么?是否可以?

4

3 回答 3

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)

于 2011-06-05T15:56:24.543 回答
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 。

于 2011-06-05T16:00:38.810 回答
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
}
于 2015-08-02T20:07:21.140 回答