Я пытаюсь создать черту, которая проверяет наличие вложенного шаблонного класса. Это моя попытка проверить, есть ли у класса O
вложенный класс inner
с параметром шаблона T
:
template <typename O, typename T> struct has_inner {
static const bool value = std::is_class<typename O::template inner<T> >::value;
};
Однако это не работает должным образом. Учитывая два примера классов dummy
и ok
struct dummy {};
struct ok {
template <typename T>
struct inner {
};
};
Чек на ok
std::cout << std::boolalpha << has_inner<ok, float>::value << std::endl;
будет работать, а проверка на dummy
std::cout << std::boolalpha << has_inner<dummy, int>::value << std::endl;
не скомпилируется на clang 3.2 с ошибкой
error: 'inner' following the 'template' keyword does not refer to a template
static const bool value = std::is_class<typename O::template inner<T> >::value;
^~~~~
note: in instantiation of template class 'has_inner<dummy, int>' requested here
std::cout << std::boolalpha << has_inner<dummy, int>::value << std::endl;
Похоже, что компилятор пытается фактически сформировать это шаблонное выражение, прежде чем передать его std::is_class
. Следовательно, я вижу два решения:
- Скажите компилятору отложить раскрытие шаблона, или
- Совершенно используйте другой подход.
Однако я тоже не знаю, как выполнять, может ли кто-нибудь помочь?