[英]c++ functor and function templates
考慮這個簡單而毫無意義的代碼。
#include <iostream>
struct A {
template<int N>
void test() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a.test<1>();
}
這是一個非常簡單的函數模板示例。 但是,如果我想用重載的operator()
替換A::test
以使其成為仿函數呢?
#include <iostream>
struct A {
template<int N>
void operator()() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a<1>(); // <-- error, how do I do this?
}
當然,如果operator()
接受了依賴於模板的參數,編譯器可能會推導出模板。 但我無法弄清楚使用無參數仿函數指定模板參數的正確語法。
有沒有正確的方法來做到這一點?
顯然,這個代碼可以工作,因為它繞過了仿函數語法:
a.operator()<1>();
但這有點打敗了它作為仿函數的目的:-P。
你只能打電話
a.operator()<1>();
但那不會使用仿函數。 函數需要一個非模板運算符(),因為它們必須能夠被稱為varname() ,並且不能與您的代碼一起使用。
要使它成為一個真正的仿函數,請將代碼更改為模板類(仿函數是類):
#include <iostream>
template<int N>
struct A {
void operator()() {
std::cout << N << std::endl;
}
};
int main() {
A<1> a;
a();
}
除了以下之外,我不知道另一種“直接”的方式:
a.operator()<1>();
句法。 如果你願意改變代碼,那么將模板參數移動到類就可以了,或者使用(boost | tr1):: bind來創建一個(boost | tr1):: function對象。
您正在嘗試將模板參數傳遞給對象的實例,據我所知,這是不允許的。 您只能將模板參數傳遞給模板函數或模板對象。
a.test <1>(); 和a.operator()<1>(); 因為它們作為模板功能而工作。
使用boost :: bind(檢查boost庫)來修復它。
struct A {
void operator()(int n) {
std::cout << n << std::endl;
}
};
int main(int argc, char* argv[]) {
A a;
boost::function<void()> f = boost::bind<void>(a, 1);
f(); // prints 1
return 0;
}
而你甚至不必弄亂模板!
你被困住了。 你考慮過這樣的事嗎?
struct A {
template<int N>
struct B
{
void operator()()
{ std::cout << N << std::endl; }
};
template<int N>
B<N> functor() {return B<N>();}
};
int main()
{
A a;
a.functor<1>()();
}
不,沒有辦法繞過它。 就像你說的那樣,你必須明確地調用運算符(這違背了目的),或者模板參數必須能夠由編譯器推導出來。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.