首页 文章

对于每个模板类型,设置类型的参数

提问于
浏览
7

假设我有一个可变参数模板类 . 如何创建一个函数,使其参数属于集合类型,例如 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的元组 . 为简单起见,我在示例代码中将函数显示为void .

2 回答

  • 18
    template <typename... Types>
    class Test
    {
        template <typename>
        using int_t = int;
    
    public:    
        void Func(int_t<Types>... ints)
        {
        }
    };
    

    DEMO

  • 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 .

相关问题