Параметры шаблона Variadic одного определенного типа

Почему в вариабельном шаблоне не допускается определенный тип?

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-синтаксис
  • (некрасивая) рекурсивная черта, которая проверяет все типы отдельно: см. здесь
7 голосов | спросил nonsensation 11 J0000006Europe/Moscow 2015, 09:27:09

1 ответ


0

Это разрешено, на самом деле, вы просто используете это неправильно. 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,2,3>();
}

Другим примером может быть std::integer_sequence.

ответил jrok 11 J0000006Europe/Moscow 2015, 09:38:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132