Просто пытаюсь получить этот простой тест, работающий для доступа к функциональному оператору. Я вырыл вокруг boost :: bind (esp для overloaded section), но не нашел способа заставить это работать.boost :: bind with templated functors
#include <iostream>
#include <boost/bind.hpp>
template <typename FooType>
struct Foo {
const FooType tmp_value;
Foo(const FooType& tmp_) :
tmp_value(tmp_)
{
}
template<typename Object>
void operator()(Object& operand)
{
std::cout << operand << std::endl;
operand += tmp_value;
}
};
int main() {
double t = 4.0;
Foo<double> e(1.0);
std::cout << t << std::endl;
e(t); // Works
std::cout << t << std::endl;
double d = 5.0;
Foo<double> p(1.0);
auto f1 = boost::bind(&Foo::operator(), p, _1); // Blows up at compile
std::cout << d << std::endl;
f1(d);
std::cout << d << std::endl;
}
Compiler выход:
g++ -Wall --std=c++0x -I. bind.cc -o binder
bind.cc:33:25: error: expected a class or namespace
auto f1 = boost::bind(&Foo::operator(), p, _1); // Blows up at compile
^
Я знаю, что я просто не хватает что-то простое, любая помощь будет удивительным.
Вы не можете взять адрес шаблона (и вы используете 'Foo' без указания аргумента шаблона). В любом случае у вас есть функтор, просто привяжите функтор напрямую. –
Вам нужен метод оператора шаблона? Если вам нужно использовать имя типа Foo, например 'void operator() (const FooType & operand)' then 'boost :: bind <&Foo :: operator(), p, _1);' будет работать, а также должно помочь вам не допустить, t попытаться выполнить сложные назначения на несовместимых типах. –
AJG85