あなたが望む何をすべきか理解してください、あなたが求めていない、まさにけど...ない
は私が定義されたラッパー基本クラスの使用を提案します
template <typename T1, typename T2>
struct Pair : wrap<T1>, wrap<T2>
{
template <typename T>
void set (T const & t)
{ wrap<T>::set(t); }
template <typename T>
T get() const
{ return wrap<T>::get(); }
};
として定義されるか、あなたがC++ 11と可変引数テンプレートを使用することができますし、定義した場合のタイプは、リストのN番目のタイプを取得するためにgetType
を特色場合、今
template <typename ... Ts>
struct Pair : wrap<Ts>...
{
template <typename T>
void set (T const & t)
{ wrap<T>::set(t); }
template <std::size_t N, typename T>
void set (T const & t)
{ wrap<typename getType<N, Ts...>::type>::set(t); }
template <typename T>
T get() const
{ return wrap<T>::get(); }
template <std::size_t N>
typename getType<N, Ts...>::type get()
{ return wrap<typename getType<N, Ts...>::type>::get(); }
};
を次のようにあなたは、より柔軟な方法でPair
を定義することができます
template <std::size_t I, typename, typename ... Ts>
struct getType
{ using type = typename getType<I-1U, Ts...>::type; };
template <typename T, typename ... Ts>
struct getType<0U, T, Ts...>
{ using type = T; };
set()
の引数は、そうでない場合は、正しいベースクラスと正しい基本要素
Pair<int, long> p;
p.set(0); // set the int elem
p.set(1L); // set the long elem
を選択することができ、インデックスを介して、あなたは書くことができます
が
T2
に等しい場合、これは動作しませんでした、明らかに
p.get<int>(); // get the int elem value
p.get<long>(); // get the long elem value
p.get<0U>(); // get the 1st (int) elem value
p.get<1U>(); // get the 2nd (long) elem value
残念ながら、get()
は、引数を受け取らないので、タイプは(インデックスタイプを介して、または経由)explicitedする必要があります
次は、この特定の状況では
#include <iostream>
template <std::size_t I, typename, typename ... Ts>
struct getType
{ using type = typename getType<I-1U, Ts...>::type; };
template <typename T, typename ... Ts>
struct getType<0U, T, Ts...>
{ using type = T; };
template <typename T>
class wrap
{
private:
T elem;
public:
void set (T const & t)
{ elem = t; }
T get() const
{ return elem; }
};
template <typename ... Ts>
struct Pair : wrap<Ts>...
{
template <typename T>
void set (T const & t)
{ wrap<T>::set(t); }
template <std::size_t N, typename T>
void set (T const & t)
{ wrap<typename getType<N, Ts...>::type>::set(t); }
template <typename T>
T get() const
{ return wrap<T>::get(); }
template <std::size_t N>
typename getType<N, Ts...>::type get()
{ return wrap<typename getType<N, Ts...>::type>::get(); }
};
int main()
{
//Pair<int, int> p; compilation error
Pair<int, long, long long> p;
p.set(0);
p.set(1L);
p.set(2LL);
std::cout << p.get<int>() << std::endl; // print 0
std::cout << p.get<long>() << std::endl; // print 1
std::cout << p.get<long long>() << std::endl; // print 2
p.set<0U>(3);
p.set<1U>(4);
p.set<2U>(5);
std::cout << p.get<0U>() << std::endl; // print 3
std::cout << p.get<1U>() << std::endl; // print 4
std::cout << p.get<2U>() << std::endl; // print 5
}
何かを取得して設定するゲッターとセッターがある場合は、単に公開してください。 –
私はそれがあなたの問題を解決するかどうかは確かではありませんが、多分それはあなたにいくつかの啓発を提供するでしょう - std :: tupleとstd :: getを探してください。 – ArturFH