2016-05-06 2 views
1

Я упростили 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, который вы можете попробовать.

+2

Я могу сразу сказать, что анонимная структура не может быть использована там, поскольку аргументы шаблона должны иметь внешнюю связь. Не уверен, существует ли «другой способ». – SergeyA

+0

@SergeyA Да, я пробовал каждое обходное решение, о котором я могу думать: не могу назвать лямбда, не могу локализовать специализированную специализацию по шаблону, я спрашиваю здесь, как о последнем случае, потому что моя следующая остановка - сбрасывать все в пространстве имен подробнее' –

+0

@SergeyA C++ 11 смягчил правила, внешняя связь больше не требуется. Но ваш основной пункт все еще стоит, есть еще ограничения, которые препятствуют явному ответу на этот вопрос. – hvd

ответ

0

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

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

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

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

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

Смежные вопросы