在C++0x中,我可以这样做:
double f(double x) { return x; }
template<class T>
  T f(T x) = delete;以防止在double以外的任何其他类型上调用f()。
我正在尝试做的事情是相似的,然而,并不完全相同。
我有一个在指针数组上操作的函数。例如:
template<class T>
  T* some_string_function(T* x);我希望能够使T适用于char、char16_t和char32_t,但不适用于任何其他类型。我在想,C++0x的delete将是一个很好的实现这一点的方法。基本上,我希望能够阻止此函数与三个Unicode char类型之一以外的任何类型一起工作,但我仍然希望拥有函数模板的好处,它允许我泛化类型并避免重复代码。
解决这个问题的最佳方法是什么?有可能吗?
发布于 2011-06-05 23:56:25
使用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-06 00:00:39
您可以使用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。
发布于 2015-08-03 04:07:21
我认为最好的方法是结合使用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
}https://stackoverflow.com/questions/6243988
复制相似问题