cppguy:
Tengo una plantilla que tiene este aspecto
template <typename T> class Foo
{
public:
Foo(const T& t) : _t(t) {}
private:
const T _t;
};
¿Hay alguna forma de plantilla metaprogramming inteligentes como para evitar el uso de una referencia constante en los casos en que el tipo de argumento es trivial como un bool o carbón? me gusta:
Foo(stl::smarter_argument<T>::type t) : _t(t) {}
n314159:
Creo que el tipo de rasgo de la derecha es is_scalar
. Esto funcionaría de la siguiente manera:
template<class T, class = void>
struct smarter_argument{
using type = const T&;
};
template<class T>
struct smarter_argument<T, std::enable_if_t<std::is_scalar_v<T>>> {
using type = T;
};
Editar:
Lo anterior es todavía un poco de la vieja escuela, @HolyBlackCat gracias por recordarme de esta versión más concisa:
template<class T>
using smarter_argument_t = std::conditional_t<std::is_scalar_v<T>, T, const T&>;