簡體   English   中英

具有不同類型的非類型參數的C ++可變參數模板

[英]C++ variadic template with non-type parameters of different types

我想定義一個類,該類采用非類型參數(可能是不同類型)的列表。 例如,以下內容應有效:

Test<3, 4.5, 6> t;

如果所有參數都具有相同的類型,例如int ,則可以使用以下定義:

template<int... args>
class Test {
  // ...
};

更具體地說,在我的特定用例中,第二個類Base具有許多成員,我想傳遞Base成員指針。

Test<&Base::a, &Base::b>

如果Base::aBase::b具有公共類型T ,則可以按以下方式定義Test

template<int Base::* ...args>
class Test {
  //
};

我該如何定義此類Test

您可以通過以下方式進行操作:

template <class... Types>
struct Wrapper
{
    template <Types... args>
    class Test {
        // ...
    };
};

注意,簡單的注釋template <class... Types, Types... args> class Test; 根據標准是不允許的(請參閱[temp.param] 14.1 / 15段)。

使用示例(請注意, floatdoublelong double常量不能為非類型模板參數):

Wrapper<int, char, unsigned>::Test<1, '2', 3U> t;

具有指向成員的指針的更具體的情況可以類似地實現:

struct Base
{
    int a;
    float b;
    void c() {}
};

template <class... Types>
struct Wrapper
{
    template <Types Base::*... args>
    class Test {
        //
    };
};

使用示例:

Wrapper<int, float, void ()>::Test<&Base::a, &Base::b, &Base::c> t2;

可以使用可變參數宏和decltype關鍵字來縮短此表示法。

暫無
暫無

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

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