如何将可变的std::元组作为模板参数

How can I take a variadic std::tuple as a template argument?

本文关键字:元组 参数 std      更新时间:2023-10-16

假设我有一个结构体

template <typename Args>
struct MyStruct
{
};

但是我只想用std::tuple实例化这个类,例如

Mystruct<std::tuple<>> a; // OK
Mystruct<std::tuple<int, int, double>> a; // OK
Mystruct<double> a; // FAIL

我该怎么做?

这相当简单。声明但不定义通用模板:

template<typename T> struct Mystruct;

则定义专门化:

template<typename... Ts>
struct Mystruct<std::tuple<Ts...>>
{
// stuff
};

除了krzaq的答案之外,要获得更好的错误消息,您可能需要使用static_assert

// The traits:
template <typename T>
struct is_a_tuple : std::false_type {};
template <typename ... Ts>
struct is_a_tuple<std::tuple<Ts...>> : std::true_type {};
// Your structure (for error message)
template <typename T>
struct MyStruct
{
    static_assert(is_a_tuple<T>::value, "T should be a std::tuple");
};
// Your structure (for std::tuple)
template <typename ... Ts>
struct MyStruct<std::tuple<Ts...>>
{
    // Your implementation
};