Сделать что-нибудь, если тип шаблона мгновенно

StackOverflow https://stackoverflow.com/questions/4095188

  •  28-09-2019
  •  | 
  •  

Вопрос

Я хотел бы использовать шаблон 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.

Я надеюсь, что это немного поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top