Можно ли вывести параметры шаблона кортежа из инициализации типа скобок?

В этом примере можно ли разрешить вычет типа параметров шаблона 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 . Все еще не так хорошо, как если бы была встроенная языковая функция для разнородных списков инициализаторов.

4

Решение

Нет, нет абсолютно никакого способа. Вычет не выполняется, если типы элементов не относятся к одному и тому же типу. И никакого вычета не делается вообще, если параметр не является std::initializer_list<T> в любом случае (ты прав, что initializer_list не имеет никакого отношения к брекетам, которые вы даете, но это простое правило для вывода на работу).

Значения параметров шаблона должны выводиться с помощью других положений параметров функции, в которые они входят, или должны указываться явно.

2

Другие решения

Других решений пока нет …