Una forma de tiempo de compilación para determinar el tipo costoso menos argumento

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&>;

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=369307&siteId=1
Recomendado
Clasificación