gpt4 book ai didi

c++ - 根据另一个模板初始化类模板

转载 作者:行者123 更新时间:2023-12-01 14:18:14 25 4
gpt4 key购买 nike

这是我迄今为止尝试过的:

这是我的代码:

template<typename T1>
struct Foo
{
template<typename T2>
using MyPair = std::pair<T1, T2>;
using MyPairs = std::vector<MyPair>;

Foo()
{
//if T1 is an int, then I want T2 to be a double.
//if T1 is a float, then I want T2 to be an int.
}
};

如果 T1 是一个 int,我希望 T2 是一个 double。如果 T1float,我希望 T2int

我怎样才能做到这一点?

最佳答案

有很多方法可以解决这个问题。

选项-I

简单的方法是使用std::conditionalT2 定义别名。其中,如果 T1 == int T2 将是 double所有其他类型 T2 将是 int 的别名。 ( See a demo )

#include <utility>
#include <type_traits> // std::conditional, std::is_same

template<typename T1>
struct Foo /* final */
{
static_assert(std::is_same<T1, int>::value || std::is_same<T1, float>::value, "NOT A VALID TYPE T1");

using T2 = typename std::conditional<std::is_same<T1, int>::value, double, int>::type;

using MyPair = std::pair<T1, T2>;
};

如果要限制其他类型的类实例化,请提供类的条件实例化或 static_assert .


选项-II

您可以使用特征特化来定义 T2 类型。 ( See a demo )

#include <vector>
#include <utility>

// base template!
template <typename T1> struct helper_traits;

template <> // when helper_traits<`T1 == int`> then `T2 == double`
struct helper_traits<int> final { using T2 = double; };

template <> // when helper_traits<`T1 == float`> then `T2 == int`
struct helper_traits<float> final { using T2 = int; };

template<typename T1>
struct Foo /* final */
{
using T2 = typename helper_traits<T1>::T2; // will select the proper one!

using MyPair = std::pair<T1, T2>;
};

选项-III

, 使用 if constexpr您可以决定在函数中返回哪种类型,并使用它来了解 T2 的类型,如下所示:( See a demo )

#include <type_traits> // std::is_same_v

template<typename T1>
struct Foo /* final */
{
template<typename Type>
static constexpr auto typeHelper() noexcept
{
if constexpr (std::is_same_v<Type, int>)
return double{};
else if constexpr (std::is_same_v<Type, float>)
return int{};
}
using T2 = decltype(Foo<T1>::typeHelper<T1>()); // will select the proper one!

using MyPair = std::pair<T1, T2>;
};

关于c++ - 根据另一个模板初始化类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63088359/

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