Использование признаков типа 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
};
(Дополнительная сложность отчасти для обеспечения строгой гарантии исключений.)
Я знаю этот кодРабота, но разумно ли ожидать, что компилятор устранит ветки константа-ложь и сделает встраивание и т. д. для случая без исключения (где гораздо проще, чем в другом случае)? Я надеюсь на что-то, что было бы столь же эффективно в исключительном случае, как написание метода только с первым блоком в качестве тела (и наоборот, хотя я меньше беспокоюсь о сложном случае).
Если это неправильный способ сделать это, может кто-нибудь объяснить мне рекомендуемый синтаксис?