я имел ситуацию очень много сродни этому:Pass указатель функции в шаблон
#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;
}
Тогда я решил использовать указатель на функцию вместо функции объекта Ь, то есть я хотел сделать что-то вроде этого:
#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;
}
Это, очевидно, не компилируется (обратите внимание на цикличность в < -). Мой вопрос: как бы это сделать?
Простейшим решением является возврат к функциональному объекту; это также может иметь преимущества в производительности, поскольку он намного проще встраивать. У вас есть конкретная причина для поиска указателя функции? –
Как объекты функции проще встраивать? Функция легко встроена, если ее тело видно. Это справедливо для функции-члена, а также для свободной функции. – wilhelmtell
@wilhelmtell: функция-член указывается во время компиляции аргументом шаблона, поэтому его можно легко встраивать. Цель указателя функции указана во время выполнения аргументом конструктора; компилятор, возможно, не сможет сказать, что это такое, и может не включать его, даже если это возможно. –