Сделайте что-нибудь, если тип шаблона создан - PullRequest
2 голосов
/ 04 ноября 2010

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

Но возвращается «включено включено».Чего мне не хватает?

1 Ответ

1 голос
/ 04 ноября 2010

Вы должны взглянуть на заголовок boost boost / utility / enable_if.hpp и соответствующий мета / шаблон программного кода.

Самый простой способ здесь - иметь две версии fooфункция, обе функции шаблона.Одна из функций будет использовать конструкцию enable_if, а другая - конструкцию disable_if.

Я уверен, что вы можете найти лучшие примеры на сайте boost, но что-то вроде этого:

template<typename M>
typename boost::enable_if<Template<M>>::type func( ) { }

Эта функция будет определена только в том случае, если Template является допустимым типом.Поскольку вы всегда хотите скомпилировать, вам понадобится аналог, вызываемая функция, когда она недопустима:

template<typename M>
typename boost::disable_if<Template<M>>::type func( ) { }

Я не уверен, что вы можете в рамках одного шаблона определить две функции-члена вэтот шаблон, не делая их обе функции шаблона.Полагаю, вы сможете определить две функции шаблона и установить для параметра шаблона по умолчанию значение T.

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

...