2011-11-12 170 views
4

我已經創建了一個類型列表。然後我使用傳遞類型列表的模板創建一個類。當我用某些未指定的類型調用該類的打印函數時,它們會被鑄造。我怎樣才能在編譯時強制確切的類型?所以如果我使用一個不公開的類型,我會得到一個編譯器錯誤。 謝謝。編譯時間類型檢查C++

template <class T, class U> 
struct Typelist 
{ 
    typedef T Head; 
    typedef U Tail; 
}; 


class NullType 
{ 
}; 

typedef Typelist<int,Typelist<float,Typelist<char*,NullType> > > UsableTypes; 

template<class T> 
class MyClass 
{ 
    public: 
    void print(T::Head _Value) { std::cout << _Value; } 
    void print(T::Tail::Head _Value) { std::cout << _Value; } 
    void print(T::Tail::Tail::Head _Value) { std::cout << _Value; } 
    private: 
}; 


MyClass<UsableTypes> testclass; 

void TestMyClass() 
{ 
    int int_val = 100000; 
    float flt_val = 0.1f; 
    char* char_val = "Hi"; 
    short short_val = 10; 
    std::string str_val = "Hello"; 

    testclass.print(int_val); // OK 8-) 
    std::cout << endl; 
    testclass.print(flt_val); // OK 8-) 
    std::cout << endl; 
    testclass.print(char_val); // OK 8-) 
    std::cout << endl; 
    testclass.print(short_val); // this compiles OK and works ??? 8-(
    std::cout << endl; 
    testclass.print(str_val); // compile error 8-) 
    std::cout << endl; 
} 

@Kerrek SB:嗨,我還以爲是要幫我與我的下一個步驟,這是創建取決於t_list內容,類型和種類數量的打印功能。但我努力將編譯時間處理和運行時處理分開。我想要做的是爲列表中的每種類型創建一個打印功能。因此,如果列表有兩種類型,則會創建兩個打印功能,如果有五種類型,則會爲每種類型創建一個打印功能。 當我這樣做:

typedef Typelist<int,Typelist<float,Typelist<char*,NullType> > > UsableTypes; 

MyClass<UsableTypes> newclass 

這是否創建MyClass的三種實例列表中的每個類型或者它創建一個實例,我要爲每一個類型的打印功能? 我覺得我腦子裏幾乎有所有的東西,但是不能把它們放在一起。任何幫助你可以提供將感激地收到。謝謝。

+0

你的'print'函數並不是很有用,因爲它沒有實現任何遞歸。 –

回答

4

添加一個私有函數模板

template<typename T> void print(T); 

,並不需要實現。這應該捕獲所有沒有明確打印的類型,並且由於它是私有的,它會給出錯誤消息。

+0

感謝您解決了我的問題。指出時似乎很明顯:) – Stigodump

2

你必須讓你的print功能爲模板,然後檢查的類型是否匹配:

template <typename U> 
void print(const U & u) 
{ 
    // use std::is_same<typename std::decay<T::Head>::type, typename std::decay<U>::type>::value 
} 

這裏我偷is_samedecay<type_traits>,但如果你沒有C + +11,你可以從TR1或Boost中取出它們,或者自己寫下它們,因爲它們是非常簡單的類型修飾符類。

條件最好進入static_assert,這是另一個C++ 11功能,但是存在類似的C++ 98/03結構,在某種情況下會產生編譯時錯誤。

+0

+1你可以看到你已經在踩踏那個話題:) – sehe

+0

@sehe:它已經跨過我的路徑,確實如此:-) –

+0

感謝這幫助了我的下一個問題,使它創建不同大小類型的打印功能名單。 – Stigodump

0

你可以通過非const引用來強制它們是完全相同的類型。但是,你不能再使用const變量或文字。

+0

謝謝我現在開始從另一個角度看待這些問題。 – Stigodump