所以说我想制作一些constexpr
仿函数,但我可以使用bind
来做。有什么我想念的吗?为什么bind
无法返回constexpr
?
假设:
struct foo {
int b() const { return _b; }
int a() const { return _a; }
int r() const { return _r; }
const int _b;
const int _a;
const int _r;
};
我想:
constexpr auto sumB = bind(plus<int>(), placeholders::_1, bind(&foo::b, placeholders::_2));
constexpr auto sumA = bind(plus<int>(), placeholders::_1, bind(&foo::a, placeholders::_2));
constexpr auto sumR = bind(plus<int>(), placeholders::_1, bind(&foo::r, placeholders::_2));
我能做些什么来使这项工作?
答案 0 :(得分:5)
制作bind
constexpr没有技术障碍;例如,Sprout C++ Libraries有一个constexpr-enabled bind。
但是,implementations are not permitted to add constexpr to function signatures where it is not specified in the Standard,还没有任何建议将constexpr添加到我知道的bind
(Which parts of the C++14 Standard Library could be and which parts will be made constexpr?)。由于bind
是mostly superseded的lambda表达式,因此从C ++ 17开始是自动constexpr:
constexpr auto sumB = [](int x, foo const& y) { return x + y.b(); };
答案 1 :(得分:3)
好吧,我们不知道std::bind
会返回什么。它可能会起作用,但没有强制要求它起作用(在constexpr
的规范中没有任何内容被定义为std::bind
。
关于你可以做的事情,如果你有权使用C ++ 17,那就是使用lambda。在C ++ 17中,默认情况下,lambda的operator()
将标记为constexpr
,允许您执行类似
constexpr auto sumB = [](auto val, auto obj) { return val + obj.b(); };
constexpr auto sumA = [](auto val, auto obj) { return val + obj.a(); };
constexpr auto sumR = [](auto val, auto obj) { return val + obj.r(); };