#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 est évidemment quelque chose que je ne peux pas comprendre avec decltype
. Parce que selon le message d'erreur que le compilateur lance, Self est déduit comme const Stages, alors pourquoi self.member n'est pas déduit comme membre const? Aussi comment le faire fonctionner correctement, déduire des membres const pour les objets const? J'ai ajouté des parenthèses à l'expression decltype((self.mutating_chains))
et cela a passé la compilation mais je ne suis pas sûr si c'est la bonne chose à faire.decltype ne déduit pas les membres const pour les objets 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);
Vous pouvez mettre le code dans un f.cpp et le compiler et il va lancer ce message d'erreur exactement – mkmostafa