对于每个模板类型,设置类型

时间:2016-10-13 07:49:29

标签: c++ variadic-templates

假设我有一个可变参数模板类。如何创建一个函数,使其参数属于集合类型,例如int,参数个数等于模板类型的数量?

template <typename... Types>
class Test
{
public:
    void Func(???); // I don't know how to declare such a function
}

Test<string, bool, long> myTest; // Three types
myTest.Func(905, 36, 123315); // Three arguments, but always of type int.

最后,该函数的目标是返回所提供的int的元组。为简单起见,我在示例代码中将函数显示为无效。

2 个答案:

答案 0 :(得分:18)

template <typename... Types>
class Test
{
    template <typename>
    using int_t = int;

public:    
    void Func(int_t<Types>... ints)
    {
    }
};

DEMO

答案 1 :(得分:4)

wandbox example - (适用于C ++ 11)

如果您不需要SFINAE,可以使用static_assert确保符合条件:

template <typename... Types>
class Test
{
public:
    template <typename... Ts>
    void Func(Ts...)
    {
        static_assert(sizeof...(Ts) == sizeof...(Types), "");
        static_assert(std::conjunction<std::is_same<Ts, int>...>{}, "");
    }
};

(如果您需要SFINAE,请使用std::enable_if。)

std::conjunction检查传递给它的所有条件是否为真。

通过上面的示例,以下调用有效/无效:

myTest.Func(905, 36, 123315); // valid
myTest.Func(905, 36, 123315.f); // invalid
myTest.Func(905, 22); // invalid

如您所见,此解决方案不允许使用隐式转换。如果您希望允许,可以使用std::is_convertible代替std::is_same