gpt4 book ai didi

c++ - 如何启用_if 具有可变模板参数的类?

转载 作者:IT老高 更新时间:2023-10-28 23:14:37 33 4
gpt4 key购买 nike

假设我有一个具有以下签名的类:

template <typename T, typename... Args>
class A;

但是这个类的行为应该取决于其他一些参数,假设它是 T::value:

的值
template <typename T, typename... Args, typename Enable>
class A;

template <typename T, typename... Args, typename = typename std::enable_if<T::value>::type>
class A
{
// do something
};

template <typename T, typename... Args, typename = typename std::enable_if<!T::value>::type>
class A
{
// do something else
};

int main() { return 0; }

但是,这个程序给出了以下错误:

prog.cpp:6:11: error: parameter pack ‘Args’ must be at the end of the template parameter list class A;

我一直在努力寻找关于使用 enable_if 选择具有可变参数模板的类的良好信息来源。我能找到的唯一问题是这个:

How to use std::enable_if with variadic template

但尽管名称如此,但这个问题及其答案并没有多大帮助。如果有人可以提供或链接指南,说明应该如何处理以及为什么会这样做。

最佳答案

首先,您正在尝试编写类模板的多个定义。这是不允许的,因为它违反了一个定义规则。如果您想对类进行条件启用,您需要特化。此外,编译器错误消息已经告诉您,参数列表中间不能有可变参数包。

一种方法是:

namespace detail {

template<typename T, typename Enable, typename... Args>
class A_impl;

template<typename T, typename... Args>
class A_impl<T, typename std::enable_if<T::value>::type, Args...> {
// code here
};

template<typename T, typename... Args>
class A_impl<T, typename std::enable_if<!T::value>::type, Args...> {
// code here
};
}

template<typename T, typename...Args>
class A : public detail::A_impl<T, void, Args...> {};

Jonathan's way如果条件真的是一个 bool 也很好,但如果你想添加更多的特化,每个特化都依赖于几个条件,它可能没有用。

关于c++ - 如何启用_if 具有可变模板参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421104/

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