Преторианский ответ идеален, но вы также можете узнать о std::conditional
, который имеет более широкое применение.Например, рассмотрим переменную-член data_
типа int
и функцию-член, которая возвращает data_
либо по ссылке, либо по значению в зависимости от некоторых условий времени компиляции:
template <bool COND>
std::conditional_t<COND, int&, int> data() { return data_; }
Это будетне может быть достигнуто с decltype(auto)
.Вы также можете использовать ту же технику для передачи аргументов в функции по ссылке / значению:
template <bool COND>
void f(std::conditional_t<COND, int&, int> param);
Или вы можете переключаться между конструкторами копирования / перемещения:
class X {
X(std::conditional_t<some_cond, const X&, X&&>) = default;
X(std::conditional_t<some_cond, X&&, const X&>) = delete;
...
};
И т.д. ...