Сделать что-нибудь, если тип шаблона мгновенно
Вопрос
Я хотел бы использовать шаблон Sfinae для выполнения некоторых кода, если я смогу создать определенный класс шаблона. Давайте представим это:
//Only instantiable with types T for which T.x() is ok:
template <class T>
class TemplateClass
{
T t;
public:
void foo() {
t.x();
}
}
template <class T>
class User
{
void foo()
{
"if TemplateClass<T> is ok then do something else do nothing"
}
}
Как я мог это сделать?
Большое спасибо!
Редактировать: на основе ответа EDA-QA Mort-Ora-Y попробовал:
template <class T>
struct TemplateClass
{
T t;
void foo() { t.x(); }
static const bool value = true;
};
struct A {};
struct B { void x() {} };
template <class T>
struct User
{
template<typename M>
typename boost::enable_if<TemplateClass<M> >::type func( )
{
std::cout << "enabled\n";
}
template<typename M>
typename boost::disable_if<TemplateClass<M> >::type func( )
{
std::cout << "disabled\n";
}
void foo()
{
func<TemplateClass<T> >();
}
};
User<A> a;
a.foo();
User<B> b;
b.foo();
Но это возвращает «Включено включено». Что мне не хватает?
Решение
Вы должны посмотреть на повышение Boost / Utility / enable_if.hpp Заголовок и связанный код META / шаблона программирования.
Самый простой способ здесь состоит в том, чтобы иметь две версии функции FOO, оба функции шаблонов. Одной из функций будет использовать конструкцию Enable_IF, а другая будет использовать конструкцию Disable_If.
Я уверен, что вы можете найти лучшие примеры на веб-сайте Boost, но что-то вроде этого:
template<typename M>
typename boost::enable_if<Template<M>>::type func( ) { }
Эта функция будет определена только в том случае, если шаблон является действительным типом. Поскольку вы всегда хотите компилировать, вам понадобится аналог, функция для вызова, когда она недействительна:
template<typename M>
typename boost::disable_if<Template<M>>::type func( ) { }
Я не уверен, что вы можете, в одном шаблоне, определите два функции участника в этом шаблоне, не делая их оба шаблона. Я предполагаю, что вы сможете определить два функция шаблона и установить параметр шаблона по умолчанию в T.
Я надеюсь, что это немного поможет.