gpt4 book ai didi

c++ - 使用 C++ 模板匹配类型列表中的类型

转载 作者:行者123 更新时间:2023-11-28 04:33:00 25 4
gpt4 key购买 nike

我需要在编译时使用 C++ 模板匹配类型列表中的类型。这是我的代码,但它编译为错误。知道我该如何解决吗?

template <typename T, typename X, typename... Rs>
struct match
{
using test = typename std::conditional<std::is_same<T, X>::value, X, bool>::type;
using more = typename match<T, Rs...>::type;
using type = typename std::conditional<std::is_same<test, bool>::value, more, test>::type;
};

template <typename T>
struct match<T, bool>
{
using type = bool;
};

match<int, int, float>::type x;

错误是:

1.cpp:99:45: error: wrong number of template arguments (1, should be at least 2)
using more = typename match<T, Rs...>::type;

^

最佳答案

你应该添加一个偏特化来处理恰好有两个模板参数的情况,否则 more 的实例化将导致 match 的实例化使用一个模板参数,因此会发生错误。你的match<T, bool>只处理最后一个参数是 bool 的情况,您应该将其声明为,例如,

template <typename T, typename X>
struct match<T, X>
{
using type = typename std::conditional<std::is_same<T, X>::value, X, bool>::type;
};

另外,不知道test有什么用.我想使用 more直接在type的定义中足够了:

template <typename T, typename X, typename... Rs>
struct match
{
using more = typename match<T, Rs...>::type;
using type = typename std::conditional<std::is_same<T, X>::value, X, more>::type;
};

这仍然不是最好的解决方案,因为它会导致 more 的实例化。即使T火柴X (在这种情况下,我们可以断言 match::typeX 而无需 more 的实例化)。为避免不必要的实例化,您可以添加额外的偏特化:

template <typename T, typename... Rs>
struct match<T, T, Rs...>
{
using type = T;
};

有了这个偏特化,主模板只匹配 T 的情况不是 X ,因此您可以进一步简化主模板为

template <typename T, typename X, typename... Rs>
struct match
{
using type = typename match<T, Rs...>::type;
};

为了完整起见,最终的解决方案是:

#include <type_traits>

template <typename T, typename X, typename... Rs>
struct match
{
using type = typename match<T, Rs...>::type;
};

template <typename T, typename... Rs>
struct match<T, T, Rs...>
{
using type = T;
};

template <typename T, typename X>
struct match<T, X>
{
using type = typename std::conditional<std::is_same<T, X>::value, X, bool>::type;
};

static_assert(std::is_same<int, match<int, int, float>::type>::value);

关于c++ - 使用 C++ 模板匹配类型列表中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52379065/

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