タプルを保持するテンプレート化されたクラスがあり、コンパイル時に型ごとに要素を取得できるようにしたいと考えています。簡単にするために、コンテナ クラスは最大 3 つのエントリに制限されています。
template< class U = null_type, class V = null_type, class W = null_type >
class TupleContainer {
public:
template< class ReturnT >
ReturnT& getElementbyType() {
return get< ReturnT >(data_);
}
private:
boost::tuple< U, V, W > data_;
}
Get index of a tuple element's typeおよびFor std::tuple, how to get data by type, how to get type by index? への回答を読む これは、再帰的なビジター アプローチによって達成されました。C++11 機能を備えた GNU C++ コンパイラを使用すると、問題なく動作します。
template< int Index, class Search, class First, class... Types >
struct get_internal
{
typedef typename get_internal< Index + 1, Search, Types...>::type type;
static constexpr int index = Index;
};
template< int Index, class Search, class... Types >
struct get_internal< Index, Search, Search, Types... >
{
typedef get_internal type;
static constexpr int index = Index;
};
template< class T, class... Types >
T& get( std::tuple< Types... >& tuple )
{
return std::get< get_internal< 0, T, Types... >::type::index >(tuple);
}
コードを Windows に移植する必要があります。一部の外部ライブラリの制限により、Variadic テンプレートをサポートしていないように見える Visual Studio 2010 を使用する必要があります。
回避策があると確信しています (boost::tuple は可変個引数テンプレートのサポートなしでも使用できるため) が、私はこのテンプレート メタプログラミングのトピック全体にまだ慣れておらず、まだ解決策を見つけていません。
Visual Studio 2010 で動作する可変個引数テンプレートなしでこの問題を解決する方法を知っている人はいますか?
ところで: ビジター アプローチは、要素が 3 つをはるかに超えるタプルでもうまく機能します。コンテナーは 3 つまたは 4 つのタプル要素に制限されるため、実装にインデックスをハードコーディングしてもかまいません。