2013-07-12 123 views
0

假設我有一個簡單的模板類:返回值爲模板參數的類模板從函數

template <typename ElementType, ElementType Element> 
class ConsecutiveMatcher 
{ 
public: 
    bool operator() (ElementType lhs, ElementType rhs) 
    { 
     return lhs == Element && rhs == Element; 
    } 
}; 

我通常會做實例比ConsecutiveMatcher<wchar_t, L'\\'>()簡單的通過提供可以推斷基於該模板參數類型的函數參數類型:

template <typename ElementType> 
ConsecutiveMatcher<ElementType, Element /* ?? */> 
    MakeConsMatcher(ElementType Element) 
{ 
    return ConsecutiveMatcher<ElementType, Element>(); 
} 

然而,在這種情況下,MakeConsMatcher(L'\\')將無法​​正常工作,因爲函數需要返回一個類,其模板不僅包含類型,也是一種價值。

如何從一個函數中返回一個類模板,該函數不僅具有類型模板參數,還有值模板參數?

+1

模板是編譯時的野獸。如果你在運行時使用各種'Element'值,你可以讓'Element'成爲一個構造參數嗎? – Drop

+0

靜態類型在我的用例中是可以的,我只是尋找一種方法來省略'wchar_t'並在實例化過程中使用自動類型推導。我想這是不可能的。 –

回答

0

您想將運行時計算值轉換爲模板參數嗎?這是不可能的。

+0

C++ 11'constexpr'可以這樣嗎? –

+0

最基本的問題是,您無法將可能的運行時計算值轉換爲新類型(如果更改模板參數,則需要定義新類型)。 –

1

我只是尋找一種方法來省略wchar_t並在實例化過程中使用自動類型推導。

我能想象這樣的情況:

  1. 參數類型僅在運行時知道(你對此沒有任何想法):你不能用模板處理它:你將要重新設計您的代碼並使用繼承和虛函數(或可能混合使用模板和繼承)

  2. 參數類型在編譯時已知,參數值在運行時已知:lef牛逼類型模板參數列表的說法並傳遞參數到構造函數,那麼,爲了用戶的方便,使工廠函數來推斷類型

    template<typename T> 
    struct MyType 
    { 
        template <class T> 
        MyType(const T& defaultValue) : 
         value(defaultValue) 
        {} 
        T value; 
    }; 
    
    template<typename T> 
    MyType<T> MyFactory(const T& defaultValue) 
    { 
        return MyType<T>(defaultValue); 
    } 
    
    int main() 
    { 
        char c = 'a'; 
        wchar_t w = L'a'; 
        int i = 42; 
        float f = 3.14f; 
    
        auto mt_char = MyFactory(c); 
        auto mt_wchar = MyFactory(w); 
        auto mt_int = MyFactory(i); 
        auto mt_float = MyFactory(f); 
    } 
    
  3. 在編譯時,你知道類型的列表並希望他們的行爲不同(例如具有不同的默認值):使模板專門爲每種類型從列表,然後,爲了用戶的方便,創建類型定義

    template<typename T> struct MyType 
        { 
         MyType(const T& defaultValue) : 
        value(defaultValue) 
          {} 
    
        T value; 
    }; 
    
    template<> 
    struct MyType <char> 
    { 
        MyType() : 
        value('c') 
        {} 
    
        char value; 
    }; 
    
    
    template<> 
    struct MyType <wchar_t> 
    { 
        MyType() : 
        value(L'w') 
        {} 
    
        wchar_t value; 
    }; 
    
    typedef MyType<char> MyTypeChar; 
    typedef MyType<wchar_t> MyTypeWchar; 
    
    int main() 
    { 
        MyTypeChar mt_char_default; 
        MyTypeWchar mt_wchar_default; 
    } 
    

在這種情況下,用戶仍然可以實例化自己的專業化。該方法的示例是std::basic_string類。 此外,可以簡化您的專長,如果化妝類成員staticstatic const和整型只是在成員列表定義:

template<> 
struct MyType <char> 
{ 
    static const char value = 'c'; 
};