Jak wywnioskować typ szablonu w argumentach std :: function z lambda?
Mam wariant boost :: i chciałbym wykonać funktor tylko wtedy, gdy wariant jest specjalnego typu, więc stworzyłem tę funkcję:
template<typename T, typename Variant>
void if_init(Variant& opt_variant, std::function<void(T)> functor){
if(auto* ptr = boost::get<T>(&opt_variant)){
functor(*ptr);
}
}
To działa dobrze, ale chciałbym, aby typ T został wydedukowany, abym mógł napisać:
if_init(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
Ale typ nie jest wydedukowany:
type_inference.cpp:19:5: error: no matching function for call to 'if_init'
if_init(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
^~~~~~~
type_inference.cpp:10:6: note: candidate template ignored: failed template argument deduction
void if_init(Variant& opt_variant, std::function<void(T)> functor){
Jeśli piszę:
if_init<double>(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
to dobrze działa.
Czy istnieje sposób na wywnioskowanie typu T? Chciałbym wpisać T tylko raz. Tutaj typ jest krótki, ale w prawdziwym przypadku istnieją typy długie.
Używam CLang 3.2.
Oto pełny przypadek testowy (pierwsze połączenie nie kompiluje drugiego):
#include <iostream>
#include <functional>
#include <boost/variant.hpp>
typedef boost::variant<int, double> Test;
template<typename T, typename Variant>
void if_init(Variant& opt_variant, std::function<void(T)> functor){
if(auto* ptr = boost::get<T>(&opt_variant)){
functor(*ptr);
}
}
int main(){
Test b = 1.44;
if_init<double>(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
if_init(b, [](int var){ std::cout << "I'm int and set" << std::endl; });
return 0;
}