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

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

+0

如果你能''删除'函数模板,然后编写未删除的特化,那本来是很好的。但从我从FDIS中看到的情况来看,这是不可能的。 – 2011-06-05 20:25:19

使用boost::enable_if,以及类型特征。

template<class T> 
T* some_string_function(T* x, boost::enable_if<is_char_type<T>); 

(假设is_char_type是你定义一个类型特征,其评估为true所需的类型和假,所有其他)

+4

您不需要在C++ 0x中对此进行提升,enable_if现在是标准的一部分。 – Sven 2011-06-05 16:01:43

+0

真的。出于某种原因,我的印象是''enable_if'已经被C++ 0x排除了 – jalf 2011-06-09 06:41:11

你可以使用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 
}