Шаблон SFINAE в пределах условного_t

Я упростила решение здесь чтобы помочь мне определить, есть ли у класса функция-член:

template<typename T>
struct HasTest{
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*);
template<typename R> static false_type Test(...);
using def = decltype(Test<T>(0));
};

Мне нужно использовать HasTest<T>::def::value в состоянии conditional_t. Проблема в том, что я должен сделать это с целым рядом функций, и так как мне нужно объявить структуру для каждой функции, я надеялся найти способ сделать Ошибка замены не является ошибкой (SFINAE) в состоянии. Что-то вроде:

conditional_t<struct { template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*); template<typename R> static false_type Test(...); using def = decltype(Test<T>(0)); }::def, true_type, false_type>

Этот пример явно не компилируется, но, надеюсь, он проясняет то, что я пытаюсь сделать.

Прямо сейчас я должен установить структуру для каждого метода, который я планирую проверить в namespace details а затем использовать их в моем conditional_t, Это приводит к загрязнению и отделяет внутреннюю работу SFINAE от conditional_ts он используется в

Предоставляет ли C ++ 14/17 альтернативный способ сделать это, или есть способ объявить и использовать анонимный struct в conditional_t состояние?

Я создал простой тест Вот что вы можете попробовать что-то на.

1

Решение

Согласно проекту стандарта N4582 §14.1 / p2 Параметры шаблона [temp.param] (Акцент мой):

Класс хранения не должен быть указан в параметре шаблона
декларация. Типы не должны быть определены в шаблоне-параметре
декларация.

Следовательно, вы не можете иметь что-то вроде:

conditional_t<bool, struct Foo {...}>

И, честно говоря, я не нахожу веских оснований разрешать такие конструкции в C ++, даже больше, если они являются неназванными классами (например, подумайте о проблемах с калечением).

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector