我有一个 boost::variant 并且我只想在变体是特殊类型时才执行函子,所以我编写了这个函数:
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);
}
}
这很好用,但我希望推导出类型 T,以便我可以这样写:
if_init(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
但是没有推断出类型:
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){
如果我写:
if_init<double>(b, [](double var){ std::cout << "I'm double and set" << std::endl; });
它运作良好。
有没有办法推导出类型 T ?我只想输入 T 一次。这里的类型很短,但在实际情况下,有长类型。
我正在使用 CLang 3.2。
这是完整的测试用例(第一个调用编译不是第二个):
#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;
}