Как ввести static_assert
в определение переменной шаблона?Как ввести static_assert в определение переменной шаблона
Мой attemption является использование функции лямбда:
#include <type_traits>
#include <utility>
#include <cstdlib>
namespace
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wglobal-constructors"
template< typename F >
F f = ([]() { static_assert(std::is_default_constructible<F>{}); }(), F{});
#pragma clang diagnostic pop
}
struct L
{
L() = default;
L(L const &) = delete;
L(L &&) = delete;
};
int
main()
{
static_cast<void>(f<L>);
return EXIT_SUCCESS;
}
Но для не перемещаемых объектов, невозможно построить объект значения таким образом.
Использование оператора запятой Я не могу выполнить инициализацию значения в форме F f = ([]() { static_assert(std::is_default_constructible<F>{}); }(), {});
.
Я не могу использовать дополнительный параметр шаблона в форме , typename = decltype([]() { static_assert(std::is_default_constructible<F>()); })
, из-за ошибки lambda expression in an unevaluated operand
.
Отказ от создания экземпляра SFINAE не является решением проблемы. Мне нужно static_assert
, чтобы явно сказать пользователю об ошибке.
Было бы неплохо, если static_assert
возвращение void
или bool
.
'шаблон <имяТип F> класс F_class {static_assert (...); используя тип = F; }; template typename F :: type f; ' –
zch
@zch' struct' instad of 'class' is right – Orient
С SFINAE сообщение об ошибке не очень понятно :([Demo] (http: //coliru.stacked- crooked.com/a/f3b79dcc2d79186a) – Jarod42