#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