Я упростили solution here, чтобы помочь мне определить, если класс имеет функцию-член:Шаблон SFINAE В conditional_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
. Проблема в том, что я должен сделать это с помощью целого ряда функций, и поскольку мне нужно объявить структуру для каждой функции, я надеялся найти способ сделать Substitution Fail Is Not An Error(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_t
s, в которой он используется.
Предоставляет ли мне C++ 14/17 альтернативный способ сделать это, или есть способ для меня объявить и использовать анонимный struct
в состоянии conditional_t
?
Я создал простой тест here, который вы можете попробовать.
Я могу сразу сказать, что анонимная структура не может быть использована там, поскольку аргументы шаблона должны иметь внешнюю связь. Не уверен, существует ли «другой способ». – SergeyA
@SergeyA Да, я пробовал каждое обходное решение, о котором я могу думать: не могу назвать лямбда, не могу локализовать специализированную специализацию по шаблону, я спрашиваю здесь, как о последнем случае, потому что моя следующая остановка - сбрасывать все в пространстве имен подробнее' –
@SergeyA C++ 11 смягчил правила, внешняя связь больше не требуется. Но ваш основной пункт все еще стоит, есть еще ограничения, которые препятствуют явному ответу на этот вопрос. – hvd