#include <type_traits>
#include <functional>
struct Chains
{};
struct Stages
{
Chains mutating_chains;
Chains sideffect_chains;
Chains write_chains;
void forall_chains(const std::function<void(Chains & chain)> & fun)
{
forall_chains(*this, fun);
}
void forall_chains(
const std::function<void(const Chains & chain)> & fun) const
{
forall_chains(*this, fun);
}
template <typename Self>
static void forall_chains(
Self & self,
const std::function<void(decltype(self.mutating_chains) & chain)> & fun)
{
fun(self.mutating_chains);
fun(self.sideffect_chains);
fun(self.write_chains);
}
};
显然有一些我无法理解的decltype
。因为根据编译器抛出的错误消息,Self被推断为const Stages,所以为什么self.member不会被推断为const成员?还有如何使它正常工作,推导const对象的const成员?我在表达式decltype((self.mutating_chains))
中添加了括号,并且通过了编译,但我不确定这是否是正确的操作。decltype不会推断const对象的常量成员
f.cpp: In instantiation of ‘static void Stages::forall_chains(Self&, const std::function<void(decltype (self.mutating_chains)&)>&) [with Self = const Stages; decltype (self.mutating_chains) = Chains]’:
f.cpp:150:33: required from here
f.cpp:158:33: error: no match for call to ‘(const std::function<void(Chains&)>) (const Chains&)’
fun(self.mutating_chains);
你可以把代码放在一个f.cpp中并编译它,它会正好抛出这个错误信息 – mkmostafa