#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);
}
};
Il y a manifestement quelque chose que je ne comprends pas avec decltype
. Parce que selon le message d'erreur que le compilateur jette, Self est déduit comme const Stages, alors pourquoi self.member n'est pas déduit comme const member ? Aussi, comment faire pour que cela fonctionne correctement, déduire les membres const pour les objets const ? J'ai ajouté des parenthèses à l'expression decltype((self.mutating_chains))
et qui a passé la compilation mais je ne suis pas sûr que ce soit la bonne chose à faire.
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);