C++0xキーワードを テンプレートの特殊auto
化と一緒に使用して、たとえば( に似た) という名前の関数を使用できます。whereが 1 つまたは 2 つの引数の場合、バリアント Aは次のように記述できます。boost::make_array()
make_pair()
N
namespace boost
{
/*! Construct Array from @p a. */
template <typename T>
boost::array<T,1> make_array(const T & a)
{
return boost::array<T,2> ({{ a }});
}
/*! Construct Array from @p a, @p b. */
template <typename T>
boost::array<T,2> make_array(const T & a, const T & b)
{
return boost::array<T,2> ({{ a, b }});
}
}
バリアントBとして
namespace boost {
/*! Construct Array from @p a. */
template <typename T>
boost::array<T,1> make_array(const T & a)
{
boost::array<T,1> x;
x[0] = a;
return x;
}
/*! Construct Array from @p a, @p b. */
template <typename T>
boost::array<T,2> make_array(const T & a, const T & b)
{
boost::array<T,2> x;
x[0] = a;
x[1] = b;
return x;
}
}
GCC-4.6 を使用して、まったく同じバイナリ コード-std=gnu++0x
を-O3
生成します。
auto x = boost::make_array(1,2);
のようにAとBの両方を使用する
boost::array<int, 2> x = {{1,2}};
ただし、ユーザー定義型(UDT) の場合、バリアント B によって余分なコピー コンストラクターが生成され、通常は速度が低下するため、回避する必要があります。
boost::make_array
次の場合のように、明示的な char 配列リテラルで呼び出すとエラーになることに注意してください。
auto x = boost::make_array("a","b");
const char*
リテラルはその使用において誤解を招く可能性があるため、これは良いことだと思います。
4.5 以降の GCC で利用可能なVariadic templatesをさらに使用して、それぞれのすべてのテンプレート特殊化ボイラープレート コードを定義さN
れた単一のテンプレート定義にboost::make_array()
/*! Construct Array from @p a, @p b. */
template <typename T, typename ... R>
boost::array<T,1+sizeof...(R)> make_array(T a, const R & ... b)
{
return boost::array<T,1+sizeof...(R)>({{ a, b... }});
}
これは、期待どおりに機能します。最初の引数はboost::array
テンプレート引数T
を決定し、他のすべての引数は に変換されT
ます。場合によっては、これは望ましくないかもしれませんが、可変個引数テンプレートを使用してこれを指定できるかどうかはわかりません。
おそらくboost::make_array()
Boost Librariesに入る必要がありますか?