Когда переходить на копирование/ссылку?

Скажем, у меня есть два шаблона для перегрузки operator=:

class MyClass {
public:
    template <typename T>
    std::enable_if_t<true == /* a condition */, MyClass&>
    operator=(T value) {
        std::cout << "Pass by copy" << std::endl;
    }

    template <typename T>
    std::enable_if_t<false == /* a condition */, MyClass&>
    operator=(const T &value) {
        std::cout << "Pass by reference" << std::endl;
    }
};

Какое условие было бы наиболее оптимальным для использования с std::enable_if ?

Я придумал это:

template <typename T>
struct pass_copy_cond : std::conditional<
        std::is_fundamental<T>::value ||
        std::is_pointer<T>::value ||
        (std::is_trivial<T>::value && sizeof(T) < sizeof(void*))
    , std::true_type, std::false_type>::type {};

Есть ли способ улучшить состояние?

Если реализация для передачи по значению и по ссылке будет одинаковой, вы можете просто использовать std::conditional_t для определения типа аргумента вместо использования enable_if. Преимущество в том, что вам нужно написать функцию только один раз, избегая повторений.

François Andrieux 10.04.2019 19:00

Не думал об этом. Однако, когда я пытаюсь это сделать, компилятор не может вывести argument T...

Fourmet 10.04.2019 19:19

Это хороший момент, вы не сможете напрямую выполнять дедукцию шаблона, и вы не можете явно указать аргументы шаблона для оператора. Вы могли бы идеально перенаправить operator() на приватную функцию, которая на самом деле реализует поведение, но на данный момент я не уверен, что это все еще стоит того.

François Andrieux 10.04.2019 19:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
3
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Некоторые проверки являются избыточными:

Все основные типы и типы указателей также тривиальны. По общему признанию, некоторые фундаментальные типы могут быть больше, чем void* (указатели на член / функцию-член, хотя они, вероятно, больше, не обнаруживаются std::is_pointer).

Это чрезмерное ограничение:

Достаточно быть тривиально копируемым, тривиальная конструируемость по умолчанию не имеет значения. Можно даже привести доводы в пользу того, что одной лишь тривиальной разрушаемости достаточно.

template <class T>
using prefer_copy = std::bool_constant<std::is_trivially_copyable<T>() && sizeof(T) <= sizeof(std::max_align_t)>;

Вы будете писать реализацию дважды

Если ваш компилятор позволяет вам форсировать встраивание (не стандартизировано, но почти каждый компилятор так или иначе это допускает), вы можете делегировать эту единственную общую реализацию и получить ее встраивание.

Другие вопросы по теме