バリアントがどのように実装されているかを理解しようとしています。
http://www.codeproject.com/KB/cpp/TTLTyplist.aspx
そして、私は X 型を取るバリアントを書くことができないという印象を受けています。ただし、テンプレート作成者は N を選択し、バリアントには N 未満の型しか持てません。
これは正しいです?
ありがとう!
バリアントがどのように実装されているかを理解しようとしています。
http://www.codeproject.com/KB/cpp/TTLTyplist.aspx
そして、私は X 型を取るバリアントを書くことができないという印象を受けています。ただし、テンプレート作成者は N を選択し、バリアントには N 未満の型しか持てません。
これは正しいです?
ありがとう!
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 を使用している場合は、そのメタプログラミング ライブラリを使用してください。)
はい - ライブラリの実装によって設定された制限があります。IIRC では、Loki の最大値はデフォルトで 99 です。その記事をちらりと見ると、彼は制限を 5 に設定しています。これはおそらく多くの作業には十分ですが、それを超える可能性があることがわかります。Loki で許可されている 99 を超えることはまったく想像できません (ただし、どちらの場合も、必要に応じて制限を拡張するのは簡単な編集作業です)。
可変個引数テンプレートのサポートがない場合、テンプレート作成者は可変個引数テンプレートのような回避策しか提供できません:
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 {};
それは現在の基準では正しいです。テンプレートは固定数の引数しか持つことができず、ライブラリはプリプロセッサのメタプログラミングなどの手法を使用して、可変個のテンプレート パラメータを特定の最大値までシミュレートします。通常、最大値はほとんどの人が使用する値をはるかに上回るように設定されているため、これは実際にはそれほど問題にはなりません。
新しい 0x 標準では、真の可変個引数テンプレート パラメーターがサポートされています。