¿Es posible inferir los parámetros de la plantilla de la tupla a partir de la inicialización de tipo llave?
En este ejemplo, es posible permitir la deducción del tipo de parámetros de la plantilla deltuple
?
#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)
}
Agregué el segundo argumento.other
Evitar soluciones que involucren argumentos variad al nivel de la función.fun
. Además, estoy tratando de evitar el uso demake_tuple
, al menos a partir del código de usuario (es decir, enmain()
). De hecho no necesita ser eltuple
escriba el involucrado siempre que la "sintaxis deseada" esté permitida y de alguna manera sus tipos de elementos puedan deducirse en una etapa posterior.
(Además, aunque similar, esto no tiene nada que ver coninitializer_list
ya que no funciona en absoluto teniendo elementos disímiles en las llaves)
Falla al menos conclang 3.2
ygcc 4.7.2
. ¿Hay alguna esperanza de que funcione con el estándar actual o futuro? (por ejemplo, un futuro (?)initializer_tuple
.)
(Esto puede ser muy útil para agregar expresividad a las llamadas de función, agregando subelementos, pero se puede argumentar sobre)
Nota: Para el código de ejemplo parece questd::forward_as_tuple
es mas apropiado questd::make_tuple
por lo que los argumentos no son necesariamente copiados:http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple . Todavía no es tan bueno como si hubiera una función de lenguaje incorporada para listas de inicialización heterogéneas.