簡體   English   中英

模板非類型參數重載

[英]Template non-type parameter overload

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

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宏,我必須對存根類具有相同的模板非類型“重載”,以便執行要執行的功能(而且我必須對類而不是構造函數進行模板化,我當然可以重載,因為不可能顯式聲明構造函數模板參數,並且由於模板參數是非類型的,因此我也無法推導出它們)。

編輯

指向成員函數的指針必須是編譯時值(非類型模板參數),因為它將包裝在非模板靜態方法中,然后可以將其存儲在運行時可用的std :: vector中。

尚不清楚您要解決什么問題。 如果您只是想讓示例發揮作用,可以將'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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM