gpt4 book ai didi

c++ - 在 C++ 中,如何根据类中的参数返回不同的泛型类型?

转载 作者:行者123 更新时间:2023-11-28 05:06:55 24 4
gpt4 key购买 nike

我有这个代码:

template<class T1, class T2>
class Pair
{
private:
T1 first;
T2 second;

public:
void SetFirst(T1 first)
{
this.first = first;
}
void SetSecond(T2 second)
{
this.second = second;
}
T1 GetFirst()
{
return first;
}
T2 GetSecond()
{
return second;
}
};

我如何实现两个单一的方法 SetValue()GetValue(),而不是我拥有的四个方法,它们根据参数决定应该是哪个泛型类型用过的?例如,我认为 GetValue() 方法可以采用 1 或 2 的 int 参数,并根据数字返回 类型的变量T1T2。但是我事先不知道返回类型,所以有没有办法解决这个问题?

最佳答案

不确定您想要什么,也不确定您的要求是什么,但是...

我建议使用如下定义的包装器基类

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() 不接收参数,因此类型必须明确(通过类型或通过索引)

   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
}

关于c++ - 在 C++ 中,如何根据类中的参数返回不同的泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44489515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com