2011-06-05 35 views
0

在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

回答

3

使用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

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。

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 
}