gpt4 book ai didi

C++ 根据其他模板参数推导模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:31 25 4
gpt4 key购买 nike

假设我有以下类(class):

template <class T, class U, class V> Foo
{
...
};

模板参数具有不同的映射,因此我可以根据 T 是什么推导出其他模板参数 U 和 V。例如,如果 T 是 double,则 U 和 V 将始终是某些类 D1 和 D2,如果 T 是 float,则 U 和 V 将始终是其他类 F1 和 F2。

考虑到这一点,有没有一种方法可以只传入一个模板参数,并让编译器推导出其他两个参数?

我知道简单的答案是让这些其他类也模板化并将模板参数 T 传递给它们,但我无法使这些类模板化(它们是由工具自动生成的)。

理想情况下,我可以像这样使用 typedef 或 #define:

typedef Foo<double> Foo<double, D1, D2>
typedef Foo<float> Foo<float, F1, F2>

但是这些不编译。我想知道是否有一种方法可以使用模板元编程或模板模板参数来解决这个问题,但我似乎无法理解这些概念,我有一种直觉,可能有一个更简单的答案。有人有什么想法吗?

最佳答案

Angew 给出的答案向您展示了正确的方法,但没有向您展示如何应对无法推导出 UV必须推导的情况 由实例化客户端提供。

要处理这种情况,您可以为模板参数 UV 分配默认参数:

struct D1 { }; struct D2 { };
struct F1 { }; struct F2 { };

// Primary template
template<typename T>
struct deduce_from
{
};

// Specialization for double: U -> D1, V -> D2
template<>
struct deduce_from<double>
{
typedef D1 U;
typedef D2 V;
};

// Specialization for float: U -> F1, V -> F2
template<>
struct deduce_from<float>
{
typedef F1 U;
typedef F2 V;
};

// Give defaults to U and V: if deduce_from is not specialized for
// the supplied T, and U or V are not explicitly provided, a compilation
// error will occur
template<
typename T,
typename U = typename deduce_from<T>::U,
typename V = typename deduce_from<T>::V
>
struct Foo
{
typedef U typeU;
typedef V typeV;
};

下面是一个简单的程序来测试上述解决方案的正确性:

#include <type_traits>

int main()
{
static_assert(std::is_same<Foo<double>::typeU, D1>::value, "Error!");
static_assert(std::is_same<Foo<double>::typeV, D2>::value, "Error!");
static_assert(std::is_same<Foo<float>::typeU, F1>::value, "Error!");
static_assert(std::is_same<Foo<float>::typeV, F2>::value, "Error!");

// Uncommenting this will give you an ERROR!
// No deduced types for U and V when T is int
/* static_assert(
std::is_same<Foo<int>::typeU, void>::value, "Error!"
); */
static_assert(
std::is_same<Foo<int, bool, char>::typeU, bool>::value, "Error!"
); // OK
static_assert(
std::is_same<Foo<int, bool, char>::typeV, char>::value, "Error!"
); // OK
}

关于C++ 根据其他模板参数推导模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15025704/

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