不是一定要了解你想要什麼,你問不完全是,但...
我建議使用規定的包裝基類的如下
template <typename T>
class wrap
{
private:
T elem;
public:
void set (T const & t)
{ elem = t; }
T get() const
{ return elem; }
};
現在你的類可以定義爲
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和可變參數模板,如果你定義一個類型性狀getType
獲得第N類型的列表中,
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; };
可以定義一個更靈活的方式Pair
如下
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(); }
};
現在的set()
的參數可以選擇正確的基類和正確的基本元素
Pair<int, long> p;
p.set(0); // set the int elem
p.set(1L); // set the long elem
否則,通過索引,您可以編寫
p.set<0U>(3); // set the 1st (int) elem
p.set<1U>(4); // set the 2nd (long) elem
不幸的是,get()
不接收參數,所以類型必須explicited(通過類型或通過指數)
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
顯然,這不工作的時候T1
等於T2
以下是(C++ 11)全面工作示例
#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
}
如果你有getter和setter只是獲取和設置的東西,只是公開。 –
我不確定,如果它能解決你的問題,但也許它爲你提供了一些啓發 - 尋找std :: tuple和std :: get。 – ArturFH