2014-03-01 55 views
0

我正在編碼的東西,我最終不得不使用虛擬參數來實現模板特化,因爲你不能重載的返回類型。我想知道這是否正確,即其他人是否做到了,或者有更好的方法去做。使用虛擬參數來協助模板特化

namespace ObjectDetail 
{ 
template <typename T> 
inline T get(Object&, int, T&); 

template <> 
inline std::string get(void* handle, int index, std::string& unused) // dummy argument. 
{ 
    return somelib_get_string(handle, index); 
} 

template <> 
inline int get(void* handle, int index, int& unused) // dummy argument. 
{ 
    return somelib_get_int(handle, index); 
} 
} // namespace ObjectDetail 

class Object 
{ 
public: 
    std::string getString(int index) const 
    { 
     std::string unused; // dummy variable. 
     return ObjectDetail::get(m_handle, index, unused); 
    } 

    int getInt(int index) const 
    { 
     int unused; // dummy variable. 
     return ObjectDetail::get(m_handle, index, unused); 
    } 

private: 
    void* m_handle; 
} 

我也希望編譯器(gcc 4.6.3)足夠聰明地發現虛擬參數沒有被實際使用。

回答

1

這很好。我寧願用一些假標籤類型:

class classA {}; 
class classB {}; 
class classC {}; 

,並用它們來代替整型,字符串等

,然後做

return ObjectDetail::get(m_handle, index, classC()); 

你也可以把這些標籤類型的命名空間並從邏輯上命名它們。