Является ли следующий шаблон кода разумным при использовании признаков в шаблоном коде, где обе альтернативные реализации всегда компилируются?
Чтение кода кажется более ясным, чем использование других shenanigans для условной компиляции (но тогда, возможно, я просто недостаточно хорошо знаком с этими shenanigans).
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 copy constructor won't throw
}
else
{
// some longer code with try/catch blocks and more complexity
}
}
// many other methods
};
(Добавленная сложность частично обеспечивает сильную гарантию исключения.)
Я знаю, что этот код будет работать, но разумно ли ожидать, что компилятор устранит константно-ложные ветки и сделает inlining и т.д. для случая без исключения (где намного проще, чем в другом случае)? Я надеюсь на что-то, что было бы столь же эффективно в noexcept случае, как писать метод только с первым блоком как тело (и наоборот, хотя я меньше беспокоюсь о сложном случае).
Если это не правильный способ сделать это, может кто-нибудь, пожалуйста, просветить меня до рекомендуемого синтаксиса?