J'utilise Visual Studio 2008. J'ai cette classe:Comment cacher une fonction basée sur un paramètre de modèle
template <bool T1>
class Foo {
public:
void doSomething() {}
Foo<T1>& operator=(int a) {
doSomething();
return *this;
}
};
Mais je veux que la méthode operator=
être cachée (en faisant simplement: return *this
) si le paramètre de modèle T1
est faux.
J'ai besoin que pour les instances de Foo, les lignes:
Foo<false> foo;
foo = 20; //this should give a compilation error
donc j'ai essayé spécialisé la définition de classe:
template<>
class Foo<false> {
private:
Foo<false>& operator=(int a) {
return *this;
}
};
Cependant, en faisant cela je perds la méthode doSomething()
sur les instances qui sont Foo<false>
, ce qui n'est pas ce dont j'ai besoin.
J'ai essayé de retirer le operator=
avec boost :: enable_if, comme ceci:
typename boost::enable_if<
boost::mpl::bool_<T1>
, Foo<T1>
>::type&
operator=(int a) {
callProxy();
return *this;
}
Mais cela me rend incapable d'avoir une classe comme les suivantes:
class Bar {
public:
Foo<true> assignable;
Foo<false> unassignable;
};
J'ai a également essayé de mettre les deux méthodes dans Foo et les supprimer avec boost::enable_if
et boost::disable_if
, comme ceci:
template <bool T1>
class Foo {
public:
void doSomething() {}
typename boost::enable_if<
boost::mpl::bool_<T1>
, Foo<T1>
>::type&
operator=(int a) {
doSomething();
return *this;
}
private:
typename boost::disable_if<
boost::mpl::bool_<T1>
, Foo<T1>
>::type&
operator=(int a) {
return *this;
}
};
Ce qui n'a pas fonctionné aussi (je m'attendais à cela, mais cela valait la peine d'essayer).
Alors, est-il possible d'obtenir le comportement dont j'ai besoin, et si oui, comment pourrais-je le faire?
Je suis confus pourquoi vous avez besoin d'un tel comportement. :) – GManNickG