c – 一种特定类型的可变参数模板参数

前端之家收集整理的这篇文章主要介绍了c – 一种特定类型的可变参数模板参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么可变参数模板包中不允许特定类型?
template< typename T >
class Foo
{
public:
    template< typename... Values >
    void bar( Values... values )
    {
    }

    template< T... values >            <-- Syntax error
    void bar( T... values )
    {
    }

    template< int... values >          <-- Syntax error
    void bar( int... values )
    {
    }
};

什么是不允许这样做的理由?
有这个建议吗?

注意:替代方案是

> std :: initializer_list< T>没有缩小类型和{} -brace语法
>一个(丑陋的)递归特征,分别检查所有类型:see here

解决方法

实际上,你只是允许它使用它是错误的. T …和int …是非类型参数包,它们的元素是值,因此您不能将它们用作类型说明符(并且您不能从函数调用中推断它们).

正确用法的一个例子:

template<int... Is>
struct IntPack {};

IntPack<1,2,3> p;

要么

template< typename T >
struct Foo
{
    template< T... Ts>
    void bar()
    {
    }
};

int main()
{
    Foo<int> f;
    f.bar<1,3>();
}

另一个例子是std::integer_sequence.

猜你在找的C&C++相关文章