Я упростила решение здесь чтобы помочь мне определить, есть ли у класса функция-член:
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_t
s он используется в
Предоставляет ли C ++ 14/17 альтернативный способ сделать это, или есть способ объявить и использовать анонимный struct
в conditional_t
состояние?
Я создал простой тест Вот что вы можете попробовать что-то на.
Согласно проекту стандарта N4582 §14.1 / p2 Параметры шаблона [temp.param] (Акцент мой):
Класс хранения не должен быть указан в параметре шаблона
декларация. Типы не должны быть определены в шаблоне-параметре
декларация.
Следовательно, вы не можете иметь что-то вроде:
conditional_t<bool, struct Foo {...}>
И, честно говоря, я не нахожу веских оснований разрешать такие конструкции в C ++, даже больше, если они являются неназванными классами (например, подумайте о проблемах с калечением).
Других решений пока нет …