Можно ли вывести параметры шаблона кортежа из инициализации типа фигурных скобок?
В этом примере можно ли разрешить вычет типа параметров шаблонаtuple
?
#include<tuple>
#include<string>
template<class T1, class T2>
void fun(std::tuple<T1, T2> t, std::string other){}
int main(){
fun(std::tuple<double, int>(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<T1, T2> 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 , Все еще не так хорошо, как если бы была встроенная языковая функция для разнородных списков инициализаторов.