C ++ 0x: как получить переменные параметры шаблона без ссылки? - PullRequest
2 голосов
/ 26 февраля 2011

Учитывая следующий надуманный (и да, ужасный) пример:

template<typename... Args>
void something(Args... args)
{
    std::tuple<Args...> tuple; // not initializing for sake of example
    std::get<0>(tuple) = 5;
}

Это работает, если вы называете это так:

int x = 10;
something<int>(x);

Однако, это не работает, если выназовите это так:

int x = 10;
something<int&>(x);

Из-за присвоения 5. Предполагая, что я не могу по какой-либо причине инициализировать кортеж, когда он определен, как я могу заставить это работать при указании типа какссылка?

В частности, я хотел бы, чтобы кортеж был std::tuple<int>, даже если Args... равен int&.

Фактический вариант использования для этого включает десериализацию строки в кортежгде Args... - это типы параметров функции, которая затем вызывается при распаковке кортежа.Все это прекрасно работает, за исключением случаев, когда функция принимает параметр по ссылке.

Я использую gcc 4.5.2, но принимаю ответ, который еще не реализован в этом компиляторе.

Ответы [ 2 ]

9 голосов
/ 26 февраля 2011

Я не понимаю вашего вопроса. Этот код прекрасно работает с GCC, и я не вижу причин, почему он не должен работать.

#include <tuple>

template<typename... Args>
void something(Args... args)
{
  std::tuple<Args...> tuple{args...};
  std::get<0>(tuple) = 5;
}

int main() {
  int x = 10;
  something<int&>(x);
}

[js@HOST2 cpp]$ g++ -std=c++0x main1.cpp
[js@HOST2 cpp]$

Я не знаю, что вы подразумеваете под "инициализировать шаблон".


Поскольку вы уже обновили вопрос, я могу обновить свой ответ

template<typename... Args>
void something(Args... args)
{
  std::tuple<typename std::decay<Args>::type...> tuple;
  std::get<0>(tuple) = 5;
}

decay удаляет const / volatile, удаляет ссылки и преобразует массивы и типы функций в указатели элементов и функций соответственно. Это то, что вы, похоже, ищете.

4 голосов
/ 26 февраля 2011

Вы пробовали std::tuple<std::remove_reference<Args>...>?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...