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;
}

questionAnswers(1)

yourAnswerToTheQuestion