为什么我不能构造一个绑定?
Why Can't I constexpr a bind?
所以说我想制作一些 constexpr
仿函数,虽然我可以使用 bind
来做到这一点。有什么我想念的吗?为什么不能 bind
return 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));
我可以做些什么来完成这项工作吗?
好吧,我们不知道什么 std::bind
returns。它可能可以工作,但没有任何强制要求使其工作(在 std::bind
的规范中没有定义为 constexpr
)。
不过,如果您可以访问 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(); };
制作bind
constexpr没有技术障碍;例如,Sprout C++ Libraries have a constexpr-enabled bind.
但是,implementations are not permitted to add constexpr to function signatures where it is not specified in the Standard, and there has not yet been any proposal to add constexpr to bind
that I am aware of (Which parts of the C++14 Standard Library could be and which parts will be made constexpr?). It is fairly unlikely that one would be forthcoming, since bind
is mostly superseded 通过 lambda 表达式,从 C++17 开始自动 constexpr:
constexpr auto sumB = [](int x, foo const& y) { return x + y.b(); };
所以说我想制作一些 constexpr
仿函数,虽然我可以使用 bind
来做到这一点。有什么我想念的吗?为什么不能 bind
return 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));
我可以做些什么来完成这项工作吗?
好吧,我们不知道什么 std::bind
returns。它可能可以工作,但没有任何强制要求使其工作(在 std::bind
的规范中没有定义为 constexpr
)。
不过,如果您可以访问 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(); };
制作bind
constexpr没有技术障碍;例如,Sprout C++ Libraries have a constexpr-enabled bind.
但是,implementations are not permitted to add constexpr to function signatures where it is not specified in the Standard, and there has not yet been any proposal to add constexpr to bind
that I am aware of (Which parts of the C++14 Standard Library could be and which parts will be made constexpr?). It is fairly unlikely that one would be forthcoming, since bind
is mostly superseded 通过 lambda 表达式,从 C++17 开始自动 constexpr:
constexpr auto sumB = [](int x, foo const& y) { return x + y.b(); };