2012-02-29 87 views
3

我有一個模板類,可以(有時必須)採用const類型,但是有一種方法會返回具有相同類型的類的新實例,但應該明確非const。例如,下面的代碼編譯失敗在模板中獲取非const類型

template<class T> class SomeClass { 
public: 
    T val; 
    SomeClass(T val) : val(val) {} 
    SomeClass<T> other() { 
     return SomeClass<T>(val); 
    } 
}; 

int main() { 
    SomeClass<const int> x(5); 
    SomeClass<int> y = x.other(); 
    return 0; 
} 

,因爲即使有構造期間VAL副本,它複製到同一類型 - const int。就像你可以在模板中區分Tconst T一樣,有沒有辦法區分T和「nonconst T」?

+0

我從來沒有聽說過你可以在模板參數中使用'const'修飾符。 – 2012-02-29 18:41:36

回答

4
SomeClass<typename std::remove_const<T>::type> other() 
{ 
    return SomeClass<typename std::remove_const<T>::type>(val); 
} 

std::remove_const<type_traits>,是C++ 11。 Boost.TypeTraits中可能有boost::remove_const,或者你甚至可以推出自己的。也可以使用std::remove_cv

+0

如果你不需要C++ 11,那麼在一個充分新的編譯器中可能會有'std :: tr1 :: remove_const'。 – kennytm 2012-02-29 18:55:13

+0

是的,TypeTraits中有一個'boost :: remove_const'。 – 2012-02-29 18:56:35

+0

'',雖然出現在我的系統(boost,tr1和C++ 11變體)上,用'clang ++'和'g ++'編譯時表示找不到。無論如何,源代碼的高峯給了我std :: remove_const的定義,它的工作!謝謝! – 2012-02-29 19:07:13

0

本質上的問題是,有兩種不能嚴格轉換的不同類型。

您可以使用/從type_traits返回std::remove_const

#include <type_traits> 

template<class T> 
class SomeClass { 
public: 
    T val; 
    SomeClass(T p) : val(p) { 
    } 

    SomeClass<typename std::remove_const<T>::type> other() { 
     return static_cast<SomeClass<typename std::remove_const<T>::type> >(val); 
    } 
}; 

int main() { 
    SomeClass<const int>x(5); 
    SomeClass<int>y = x.other(); 
    return 0; 
} 
4

,如果你使用的是C++ 11。否則,您既可以使用std::remove_const,您可以使用此:

struct <typename T> 
struct remove_const 
{ 
    typedef T type; 
}; 
struct <typename T> 
struct remove_const<const T> 
{ 
    typedef T type; 
}; 

哪個不相同。

+1

+1 - 耐人尋味! – 2012-02-29 19:21:13