c++ - 推断可变参数模板的参数类型?

标签 c++ templates

有没有一种方法可以推断列表的类型以避免必须传递列表应该是的参数类型,只需从第一个元素类型推断它。

template<typename T, T... Args>
struct Calc
{
    // do stuff with Args
};

// Usage:
Calc<int, 1, 2, 3>::value;

typename<T... Args> Calc { }; // error T undefined

// Desired:
Calc<1, 2, 3>::value;          // auto deduced T = int
Calc<1.0f, 2.0f, 3.0f>::value; // auto deduced T = float

有什么方法可以获得所需的行为,还是我必须将类型作为参数包含在内?

最佳答案

按照 Quentin 的建议,这里有一个类示例,它允许您为任何类型指定非类型可变参数,而无需明确拼写类型。但是, float 不能用作模板非类型参数。

以下编译:

#include <type_traits>

enum class Letters {
        Alpha, Beta, Gamma
};

template<auto... Args>
struct Calc;

template<auto Arg1, auto... Args>
struct Calc<Arg1, Args...> {
        using type = decltype(Arg1);
        static type value;
};

template<>
struct Calc<> {
        using type = void;
};

int main() {
        //Calc<1, 2, 3>::value is int
        static_assert(std::is_same_v<typename Calc<1, 2, 3>::type, int>);

        //Calc<Letters::Alpha, Letters::Gamma>::value is Letters
        static_assert(std::is_same_v<typename Calc<Letters::Alpha, Letters::Gamma>::type, Letters>);

        //Calc<>::value does not exist as the type would be `void`
        static_assert(std::is_same_v<typename Calc<>::type, void>);

        return 0;
}

关于c++ - 推断可变参数模板的参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25922445/

相关文章:

c++ - 在派生模板类中看不到来自基模板类的指针

c++ - 发布 C++ 宏定义

c++ - Visual C++ 的这种奇怪的内联行为是否符合预期?

c++ - 从嵌套的 STL 模板推断类型

c++ - 函数模板 : clang rejects, gcc 接受的从属名称查找

c++ - 导出模板代码 = 危险? (MSVC)

c++ - 我的程序在进入 main() 函数之前退出

c++ - 乘法类型的确定

c++ - 使用可变参数模板作为类和方法的参数

c++ - 如何在模板类型中强制执行静态成员初始化?或者如何获取从模板类型派生的所有类的数量?