【发布时间】:2014-10-20 22:21:46
【问题描述】:
只是试图让这个简单的测试用于访问函数运算符。我已经研究了 boost::bind (尤其是 overloaded section ),但还没有找到让它工作的方法。
#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;
}
编译器输出:
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),那么boost::bind<&Foo<double>::operator(), p, _1);将起作用,并且还应该有助于确保您不会尝试对不兼容的类型执行复合赋值。
标签: c++ c++11 boost functor boost-bind