2

バリアントがどのように実装されているかを理解しようとしています。

http://www.codeproject.com/KB/cpp/TTLTyplist.aspx

そして、私は X 型を取るバリアントを書くことができないという印象を受けています。ただし、テンプレート作成者は N を選択し、バリアントには N 未満の型しか持てません。

これは正しいです?

ありがとう!

4

4 に答える 4

4

C++03 には、可変個引数テンプレートはありません。これは、はいという意味です。いくつかの N を選択して、それと一緒に暮らすだけです。

C++0x では可変個引数のテンプレートがあるため、すべての X に対して 1 つの定義を使用できます。

数値を簡単に変更したい場合は、Boost.Preprocessorを使用して作業を行うことができます。

#define MAXIMUM_TYPELIST_SIZE 20 // or something

struct empty{};

template <BOOST_PP_ENUM_BINARY_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T, =empty)>
struct typelist;

template <BOOST_PP_ENUM_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T)>
struct typelist
{
    typedef T1 head;
    typedef typelist<
            BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(MAXIMUM_TYPELIST_SIZE), T)> tail;
    enum
    {
        length = tail::length+1
    };
};

5 の場合MAXIMUM_TYPELIST_SIZE、それらのマクロは記事の内容に展開されます。

(もちろん、Boost を使用している場合は、そのメタプログラミング ライブラリを使用してください。)

于 2010-01-25T04:22:32.260 に答える
2

はい - ライブラリの実装によって設定された制限があります。IIRC では、Loki の最大値はデフォルトで 99 です。その記事をちらりと見ると、彼は制限を 5 に設定しています。これはおそらく多くの作業には十分ですが、それを超える可能性があることがわかります。Loki で許可されている 99 を超えることはまったく想像できません (ただし、どちらの場合も、必要に応じて制限を拡張するのは簡単な編集作業です)。

于 2010-01-25T04:21:48.093 に答える
2

可変個引数テンプレートのサポートがない場合、テンプレート作成者は可変個引数テンプレートのような回避策しか提供できません:

template<class Arg1=nil, class Arg2=nil /* , ... */>
struct foo {};

ここでは、作成者が提供するテンプレート引数の数が制限です。

それらがそのような回避策を提供しない場合、明示的な型リストに頼らざるを得なくなりますが、これは比較すると非常に不器用です:

typedef list<T1, list<T2, list<T3, nil> > > myTypeList;
foo<myTypeList>::bar;

これらは固定数のタイプに限定されていませんが、明示的に使用したいものではありません。

次の C++ 標準では、これは真の可変個引数テンプレートで解決されます。

template<class... Args> // can take 0..n arguments 
struct foo {};
于 2010-01-25T04:25:09.237 に答える
1

それは現在の基準では正しいです。テンプレートは固定数の引数しか持つことができず、ライブラリはプリプロセッサのメタプログラミングなどの手法を使用して、可変個のテンプレート パラメータを特定の最大値までシミュレートします。通常、最大値はほとんどの人が使用する値をはるかに上回るように設定されているため、これは実際にはそれほど問題にはなりません。

新しい 0x 標準では、真の可変個引数テンプレート パラメーターがサポートされています。

于 2010-01-25T04:21:12.570 に答える