2013-06-01 125 views
2

是否有可能擁有兩個具有相同名稱但不同類型模板參數的模板類 - 因此某種非類型模板參數負載機制?模板非類型參數過載

template <typename T, typename U, void (T::*F)(U)> void common() { ... } 
template <typename T, typename U, void (T::*F)(const U &)> void common() { ... } 

struct Foo 
{ 
    void foo(bool) {} 
} 

struct Bar 
{ 
    void bar(const bool &) {} 
} 

template <typename T, typename U, void (T::*F)(U)> struct Storage 
{ 
    Storage() { common <T, U, F>(); } 
} 
template <typename T, typename U, void (T::*F)(const U &)> struct Storage 
{ 
    Storage() { common <T, U, F>(); } 
} 

Storage<Foo, bool, &Foo::foo> foo; 
Storage<Bar, bool, &Bar::bar> bar; 

有這樣一個機制的原因是,兩者都應該能夠使用相同的宏創建。

#define STORAGE(T, U, F) Storage<T, U, F> BOOST_PP_CAT(storage, __LINE__); 

STORAGE(Foo, bool, &Foo::foo) 
STORAGE(Bar, bool, &Bar::bar) 

感謝您的輸入!

編輯

可能是一些進一步的輸入是有幫助的。

我想實現的是一種在初始化時運行的方法。我可以提供這樣的方法 - 或者更好的說兩個重載的方法,一個使用const-ref,另一個使用value-member-function-pointer;但爲了在啓動時執行它們,我通常會有一個存根類(如本例中爲Storage),它在其構造函數中調用此方法(因此在初始化時,STORAGE宏創建存根類的實例)。

要使用相同的STORAGE宏,我必須爲stub類擁有相同的模板非類型'重載'我有要執行的函數(我將不得不模板類而不是構造函數,它我當然可以重載,因爲不可能顯式聲明構造函數模板參數,並且模板參數是非類型的,我也不能讓它們推導出來)。

EDIT

指針到成員函數必須是一個編譯時間值(一個非類型模板參數),因爲它會被裹在一個非模板靜態方法,其然後可以被存儲在運行時可用的std :: vector中。

+0

請問功能相同,而不是類爲更多的樂趣;-)你的目標是可以實現一些部分專業化,但不是那直接。 –

+0

但是樂趣在哪裏呢? ;-)你將如何解決使用部分專業化(因爲你不能專門化一個非類型的模板參數)。 –

+0

你可以專注於decltype(F)。所以你可以使用'Storage :: '(如果你需要C++ 03版本,有一些技巧)。 –

回答

0

這並不完全清楚你想要解決什麼問題。如果你只是想讓你的例子工作,你可以將'bool'改爲'const bool &'。這是否達到你想要的?

template <typename T, typename U, void (T::*F)(U)> void common() { } 

struct Foo 
{ 
    void foo(bool) {} 
}; 

struct Bar 
{ 
    void bar(const bool &) {} 
}; 

template <typename T, typename U, void (T::*F)(U)> 
struct Storage 
{ 
     Storage() { common <T, U, F>(); } 
}; 

Storage<Foo, bool, &Foo::foo> foo; 
Storage<Bar, const bool&, &Bar::bar> bar;