2010-04-04 120 views
5

如果兩個對象的模板參數在運行時相同,是否有任何方法可以從給定對象構造一個新對象?例如:C++模板類和複製構造

我與聲明中的模板類:

template<typename _Type1, typename _Type2> class Object; 

接下來,我有模板的兩個示例:

template class Object<char, int>; 
template class Object<wchar_t, wint_t>; 

現在,我想編寫一個成員函數,作爲:

template<typename _Type1, typename _Type2> 
Object<char, int> Object<_Type1, _Type2>::toCharObject() { 
    if(__gnu_cxx::__are_same<_Type1, char>::__value) 
     return *this; 
    else { 
     //Perform some kind of conversion and return an Object<char, int> 
    } 
} 

我已經嘗試了一些技術,如使用__gnu_cxx::__enable_if<__gnu_cxx::__are_same<_Type1, char>::__value, _Type1>::__type在一個拷貝構造函數爲Oject類,但我一直運行到錯誤:

error: conversion from ‘Object<wchar_t, wint_t>’ to non-scalar type ‘Object<char, int>’ requested 

有沒有辦法,我能做到這一點?任何幫助將不勝感激!

+2

您的模板類型名稱無效。下劃線後跟大寫字母標識符**保留供實施**使用。它們可能與編譯器或標準庫定義的名稱衝突。 – jalf 2010-04-04 16:06:55

+0

@jaif:別擔心類型名稱。例如,我只是隨便挑選它們。我所有的代碼實際上都是在不同的命名空間中定義的,所以應該沒有衝突。 – themoondothshine 2010-04-04 16:09:45

+3

命名空間不是問題的名稱 - 像_Type1在所有情況下都是保留的(例如,它們可能是宏),在這種情況下,不太可能被實現使用。還是你說你發佈的內容不是導致你的問題的真正代碼?那麼,不要那樣做。 – 2010-04-04 16:15:10

回答

4

你應該有什麼工作,問題是編譯器正在對return *this部分進行類型檢查,即使類型不相等(因此編譯錯誤)。只需使用return (Object<char, int>)(*this);,你應該沒問題 - 代碼執行的唯一時間是類型相同的時候,所以除了解決編譯錯誤問題外,其他任何操作都不會做任何事情。

或者,您可以使用模板特:

template <class _Type1, class _Type2> 
Object<char, int> toCharObject(Object<_Type1, _Type2> obj) 
{ 
    // Do conversion and return 
} 

// Specialisation when types are equal 
template <> 
Object<char, int> toCharObject(Object<char, int> obj) 
{ 
    return obj; 
} 

這是你可以看到一個免費的功能。你可以將它作爲一個成員函數來完成,但它更棘手,因爲你不能專門化單個成員函數 - 你必須專門研究整個類。你可以通過分解非專業代碼來解決這個問題,但這真的很難看,而且這也是一樣。

+0

@彼得:你已經擊中了頭部!我應該早就想到模板專業化了......我已經在很多地方使用了它。咄!萬分感謝! – themoondothshine 2010-04-04 16:25:31

+0

@彼得:......但不知何故,我無法讓演員工作。如果我嘗試轉換它,編譯器會報告「錯誤:無效轉換」。 – themoondothshine 2010-04-04 16:30:56

+0

這是什麼工作雖然:'返回對象(* reinterpret_cast <常量對象 *>(this))' – themoondothshine 2010-04-04 16:33:29