É possível inferir parâmetros de modelo da tupla a partir da inicialização do tipo de chave?
Neste exemplo, é possível permitir a dedução do tipo de parâmetros do modelo dotuple
?
#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)
}
Eu adicionei o segundo argumentoother
evitar soluções envolvendo argumentos variadicos ao nível da funçãofun
. Além disso, estou tentando evitar o uso demake_tuple
, pelo menos a partir do código de usuário (ou seja, emmain()
). Na verdade, não precisa ser otuple
digite o que estiver envolvido, desde que a "sintaxe desejada" seja permitida e, de alguma forma, seus tipos de elementos possam ser deduzidos em um estágio posterior.
(Além disso, embora semelhante, isso não tem nada a ver cominitializer_list
desde que não funciona de todo tendo elementos diferentes nas chaves)
Ele falha pelo menos comclang 3.2
egcc 4.7.2
. Existe alguma esperança de que funcionaria com o padrão atual ou futuro próximo? (por exemplo, um futuro (?)initializer_tuple
.)
(Isso pode ser muito útil para adicionar expressividade às chamadas de função, agregando subelementos, mas isso pode ser discutido)
Nota: Para o código de exemplo, parece questd::forward_as_tuple
é mais apropriado do questd::make_tuple
então os argumentos não são necessariamente copiados:http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple . Ainda não é tão bom como se houvesse um recurso de linguagem embutido para listas de inicializadores heterogêneos.