Можно ли вывести параметры шаблона кортежа из инициализации типа фигурных скобок?
В этом примере возможно ли разрешить вывод параметров шаблона типа?tuple
#include
#include
template
void fun(std::tuple t, std::string other){}
int main(){
fun(std::tuple(2.,3), std::string("other")); // ok
fun(std::make_tuple(2.,3), std::string("other")); // ok, but trying to avoid `make_tuple`
fun({2.,3},std::string("other")); // desired syntax but
// giving compilation error: candidate template ignored: couldn't infer template argument 'T1' void fun(std::tuple t)
}
Я добавил второй аргументother
избегать решений, включающих вариационные аргументы на уровне функцииfun
, Также я стараюсь избегать использованияmake_tuple
по крайней мере из кода пользователя (т.е. вmain()
). На самом деле это не такдолжно бытьtuple
введите тот, который участвует, пока "желаемый синтаксис " разрешено и как-то его типы элементов могут быть выведены на более позднем этапе.
(Также, хотя и похоже, это не имеет ничего общего сinitializer_list
так как это нет работает вообще с разными элементами в скобках)
Это по крайней мере сclang 3.2
а такжеgcc 4.7.2
, Есть ли надежда, что он будет работать с текущим или ближайшим стандартом? (например, будущее (?)initializer_tuple
.)
(Это может быть очень полезно для добавления выразительности к вызовам функций путем агрегирования подэлементов, но об этом можно поспорить)
Примечание: для примера кода кажется, чтоstd::forward_as_tuple
более уместно, чемstd::make_tuple
поэтому аргументы не обязательно копируются:http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple , Все еще не так хорошо, как если бы была встроенная языковая функция для разнородных списков инициализаторов.