我正在尋找一種方式來函數指針,仿函數或lambda表達式傳遞給模板函數g
它使用傳遞函數的參數類型,例如:函數和仿函數作爲參數傳遞給模板函數
template<class T1, class T2, class T3>
struct wrapper_t {
boost::function<void(T1,T2,T3)> f;
wrapper_t(boost::function<void(T1,T2,T3)> f) : f(f) {}
void operator(std::vector<T1> &a, std::vector<T2> &b, T3 c) {
assert(a.size() == b.size());
for(size_t i = 0 ; i != a.size() ; i++) f(a[i], b[i], c);
}
};
template<class T1, class T2, class T3>
wrapper_t<T1,T2,T3> make_wrapper(boost::function<void(T1,T2,T3)> f) {
return wrapper_t<T1,T2,T3>(f);
}
void f(int, double, char) {};
wrapper_t<int, double, char> w0(f); // need to repeat types
auto w1 = make_wrapper(f); // more comfortable
std::vector<int> a{{1, 2, 3}};
std::vector<double> b{{1.0, 2.0, 3.0}};
w0(a, b, 'c');
w1(a, b, 'c');
的make_wrapper
函數只存在從參數中提取類型,一些語法糖以避免必須輸入兩次。
我的問題一個最小的例子是這樣的功能:
template<class T>
void g1(const boost::function<void(T)> &) {}
使用這些輸入
void f1(int) {}
struct f2_t { void operator()(int) {} };
它無法推斷T=int
f2_t f2;
g1(f1); // mismatched types ‘const std::function<void(T)>’ and ‘void(int)’
g1(f2); // ‘f2_t’ is not derived from ‘const std::function<void(T)>’
g1([](int){}); // ‘::<lambda(int)>’ is not derived from ‘…
g1<int>(f1); // ok
g1<int>(f2); // ok
g1<int>([](int){}); // ok
但T=int
可以從一個普通的函數指針推斷,但是這並不仿函數或lambda工作之一:
template<class T>
void g2(void (*)(T)) {}
g2(f1); // ok
g2(f2); // mismatched types …
g2<int>(f2); // ok
g2([](int){}); // mismatched types …
g2<int>([](int){}); // ok
有沒有一種方法來推斷T
不只是簡單的函數指針但對於函子和lambda表達式呢?
還是它必須是這樣的東西?
template<class F>
void g(F) { typedef first_argument_of<F>::type T; }
(在我真正的代碼,我需要解構功能有四個參數這種方式,但只std::function::…argument_type
存在一個或兩個參數; boost::function
有argN_type,但我不認爲我可以無論如何使用,因爲F
並不總是function
這是我的問題,見上面,等等)
好奇操作從這個'模板'推導'std :: function'爲了調用它? –
Yakk