gpt4 book ai didi

c++ - 将模板模板参数限制为两种类型之一

转载 作者:行者123 更新时间:2023-12-05 01:26:08 31 4
gpt4 key购买 nike

我有以下类(class):

template <typename T, int N0, int N1, int N2>
struct A{};

template <typename T, int N0, int N1, int N2>
struct B{};

我希望模板函数只能采用以下两种类型之一:

template <typename AorB>
void foo(AorB& arg)
{
}

其中所有 A 和 B 都被接受。解决这个问题的最佳方法是什么?

编辑:这适用于使用继承的基类。 A<...> 将具有一些派生类 A_derived ,而 B<...> 将具有一些派生类 B_derived 。如何将 AorB 限制为类型 A<...> 或 B<...>?

最佳答案

你可以像这样定义一个辅助变量:

template<typename T>
constexpr static bool is_ab = false;

template <typename T, int N0, int N1, int N2>
constexpr static bool is_ab<A<T, N0, N1, N2>> = true;

template <typename T, int N0, int N1, int N2>
constexpr static bool is_ab<B<T, N0, N1, N2>> = true;

然后函数 foo 是否为 is_ab:

template <typename T, std::enable_if_t<is_ab<T>, int> = 0>
void foo(T arg)
{
std::cout << "AB\n";
}

template <typename T, std::enable_if_t<(!is_ab<T>), int> = 0>
void foo(T arg)
{
std::cout << "not AB\n";
}

如果您需要其他类型使用第一个重载,您可以为它们定义 is_ab,如图所示。

完整示例 here .

或者,正如@NathanOliver 评论的那样,使用一个概念。

关于c++ - 将模板模板参数限制为两种类型之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70426702/

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