x
、y
とz
のために使用することができる全てのタイプである場合全て共通基底クラスの場合、ベースポインターの解はstd::unique_ptr
(Lyubomir Stankovの場合は+1)となり、(IMHO)は良い解です。
しかし、 "複数のテンプレートパラメータを持つテンプレートクラスを作成することが可能かどうか"を尋ねました。
はい:可能です。本当にエレガントではありません(これまでのIMHO)が可能です。
私はそう願っています(役立つことができ、私は楽しみのために、次の解決策を提案するが、私は(私の例では、A
とB
がよりfoo
から派生したものではない無関係なクラスであることに注意してください)、より一般的なケースでは、と思います)
#include <tuple>
#include <string>
#include <utility>
class A
{
private:
double d;
std::string s;
public:
A (double d0, std::string s0) : d { d0 }, s { s0 } { }
};
class B
{
private:
long l;
public:
B (long l0) : l { l0 } { }
};
template <typename Tx, typename Ty, typename Tz>
class bar
{
private:
template <typename ... Ts>
using tpl = std::tuple<Ts...>;
template <std::size_t ... Is>
using is = std::index_sequence<Is...> const;
template <std::size_t N>
using mis = std::make_index_sequence<N>;
Tx x;
Ty y;
Tz z;
template <typename ... Tsx, std::size_t ... Isx,
typename ... Tsy, std::size_t ... Isy,
typename ... Tsz, std::size_t ... Isz>
bar (tpl<Tsx...> const & tx0, is<Isx...> const &,
tpl<Tsy...> const & ty0, is<Isy...> const &,
tpl<Tsz...> const & tz0, is<Isz...> const &)
: x { std::get<Isx>(tx0) ... },
y { std::get<Isy>(ty0) ... },
z { std::get<Isz>(tz0) ... }
{ }
public:
template <typename ... Tsx, typename ... Tsy, typename ... Tsz>
bar (tpl<Tsx...> const & tx0,
tpl<Tsy...> const & ty0,
tpl<Tsz...> const & tz0)
: bar(tx0, mis<sizeof...(Tsx)> {},
ty0, mis<sizeof...(Tsy)> {},
tz0, mis<sizeof...(Tsz)> {})
{ }
};
int main()
{
bar<A, B, A> aba{ std::make_tuple(2.3, "str1"),
std::make_tuple(4),
std::make_tuple(5.4, "str2") };
bar<B, A, B> bab{ std::make_tuple(3),
std::make_tuple(3.2, "str3"),
std::make_tuple(5) };
}
残念ながら、この例では、C++ 14個の機能ですstd::make_index_sequence
とstd::index_sequence
を使用しています。
あなたがC++ 11でfoo
を実装したい場合は、std::index_sequence
とstd::make_index_sequence
template <std::size_t ...>
struct indexSeq
{ };
template <std::size_t N, std::size_t ... Next>
struct indexSeqHelper
{ using type = typename indexSeqHelper<N-1U, N-1U, Next ... >::type; };
template <std::size_t ... Next >
struct indexSeqHelper<0U, Next ... >
{ using type = indexSeq<Next ... >; };
を代用して
template <std::size_t ... Is>
using is = indexSeq<Is...>;
template <std::size_t N>
using mis = typename indexSeqHelper<N>::type;
を次のように
is
とmis
を定義するには、以下の構造体struct indexSeq
とstruct indexSeqHelper
を実装することができます整数値を使用して型を列挙することは、Evil™の反パターンです。おそらくこれは、多型クラス 'foo'へのポインタを持つデザインに対応しています。仮想デストラクタを持つ必要があります。 –