我有一個情況非常類似於此:傳遞函數指針到模板
#include <iostream>
template<class B>
class A
{
public:
A<B>(const B& b) : m_b(b) {}
void foo()
{
m_b(*this);
}
private:
B m_b;
};
class B
{
public:
template<class C>
void operator()(const C& c)
{
std::cout << "Bar!\n";
}
};
int main()
{
B b;
A<B> a(b);
a.foo();
return 0;
}
然後,我決定用一個函數指針,而不是函數對象B,即我想要做這樣的事情:
#include <iostream>
template<class B>
class A
{
public:
A<B>(const B& b) : m_b(b) {}
void foo()
{
m_b(*this);
}
private:
B m_b;
};
template<class C>
void bar(const C& c)
{
std::cout << "Bar!\n";
}
int main()
{
typedef void (*barPointer)(const A<barPointer>& a); // <--
A<barPointer> a(&bar);
a.foo();
return 0;
}
這顯然不會編譯(注意在<圓 - )。我的問題是:如何去做這件事?
最簡單的解決方案是返回到一個函數對象;這也可以具有性能優點,因爲內聯更容易。你有一個特別的理由想要一個函數指針嗎? – 2012-02-16 17:45:34
函數對象如何更容易內聯?一個功能很容易內聯,如果它的身體是可見的。這適用於成員函數以及免費函數。 – wilhelmtell 2012-02-16 17:49:01
@wilhelmtell:成員函數在編譯時由模板參數指定,因此可以很容易地進行內聯。函數指針的目標在運行時由構造函數參數指定;編譯器可能無法告訴它是什麼,即使可以,也可能不會內聯它。 – 2012-02-16 17:51:23