Ho una classe con un parametro template e voglio chiamarne un metodo. Sembra qualcosa di simile:Come rendere un metodo const basato sul parametro template?
template <typename T>
class Foo {
public:
void doSomething() {
for (auto& t: ts) {
t.doSomething();
}
}
private:
std::vector<T> ts;
};
Questo funziona, ma voglio fare doSomething()
const se T
stessa è const (si presume che T::doSomething()
sarà const troppo). Ho trovato una possibile soluzione (basata su this question), ma non mi piace.
template <bool enabled = std::is_const<T>::value>
typename std::enable_if<enabled, void>::type
doSomething() const {
for (auto& t: ts) {
t.doSomething();
}
}
template <bool enabled = !std::is_const<T>::value>
typename std::enable_if<enabled, void>::type
doSomething() {
for (auto& t: ts) {
t.doSomething();
}
}
Funziona bene, ma ha una duplicazione del codice. C'è un modo per evitarlo?
Come workarround si potrebbe aggiungere 'privato: attributo (always_inline) _doSomething' e chiamare che dal' (const) dosomething' – ted