LINUX.ORG.RU

базовый шаблон

 ,


0

2

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

template<typename _Foo> void temp_function(_Foo arg) { static_assert( ??? , "Fail"); }
template<> void temp_function(double arg) { /* code */ }
template<> void temp_function(int arg) { /* code */ }

Ответ на: комментарий от pon4ik

тогда компилятор выдаст assert даже если выбрана специализация

geks
() автор топика

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

Тебе именно асерт нужен? Так не подойдёт?

template<typename _Foo> void temp_function(_Foo) = delete;

DarkEld3r ★★★★★
()
Ответ на: комментарий от geks

Может не сработать, если написать, например temp_function<int[0]>(). Вообще пойнт в том, что выражение в static_assert-е должно зависить от темлейтного параметра, тогда оно не будет вычисляться до инстанцирования.

Можно, например так:

static_assert(!std::is_same<_Foo, _Foo>::value, "");

Или, чтоб понятнее было:

template <typename>
struct always_false {
  using type = std::integral_constant<bool, false>;
  static constexpr bool value = type::value;
};

// в функции
static_assert(always_false<_Foo>::value, "");

Kuzy ★★★
()
Ответ на: комментарий от DarkEld3r

это даже лучше.

А я думал что спецификаторы default и delete используются только для конструктора/деструктора и присваивания.

geks
() автор топика
Ответ на: комментарий от geks

А я думал что спецификаторы default и delete используются только для конструктора/деструктора и присваивания.

Для любых функций. У Страуструпа как раз есть пример использования для исключения отдельных перегрузок.

DarkEld3r ★★★★★
()

хм. а какой смысл в таком шаблоне? судя по всему, предполагается использование в другом шаблоне с ограничением на *его* инстанциирование. зачем размазывать говно по коду?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.