是否有可能擁有兩個具有相同名稱但不同類型模板參數的模板類 - 因此某種非類型模板參數負載機制?模板非類型參數過載
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中。
請問功能相同,而不是類爲更多的樂趣;-)你的目標是可以實現一些部分專業化,但不是那直接。 –
但是樂趣在哪裏呢? ;-)你將如何解決使用部分專業化(因爲你不能專門化一個非類型的模板參數)。 –
你可以專注於decltype(F)。所以你可以使用'Storage :: '(如果你需要C++ 03版本,有一些技巧)。 –