Использование признаков типа C ++ 11 для обеспечения альтернативных встроенных реализаций

Является ли следующий шаблон кода разумным при использовании признаков в шаблонном коде, где обе альтернативные реализации всегда компилируемы?

Чтение кода кажется более понятным, чем выполнение других махинаций для условной компиляции (но, возможно, я просто недостаточно знаком с этими махинациями).

template<typename T>
class X
{
    void do_something() noexcept(std::is_nothrow_copy_constructible<T>::value)
    {
        if (std::is_nothrow_copy_constructible<T>::value)
        {
            // some short code that assumes T's copy constructor won't throw
        }
        else
        {
            // some longer code with try/catch blocks and more complexity
        }
    }

    // many other methods
};

(Дополнительная сложность отчасти для обеспечения строгой гарантии исключений.)

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

Если это неправильный способ сделать это, может кто-нибудь объяснить мне рекомендуемый синтаксис?

Ответы на вопрос(6)

Ваш ответ на вопрос