Я хотел бы, чтобы следующий код компилировался, когда foo получает что-либо, полученное из базы, иначе возникает ошибка компиляции. Я написал класс type-trait is_Base, потому что std::is_base_of
не очень хорошо работает с моими шаблонами. Я рядом. Я получил его для работы с использованием static_passoff
, но я бы не хотел его использовать. Итак, как можно написать enable_if без взлома static_passoff
? Вот работает версия: http://coliru.stacked-crooked.com/a/6de5171b6d3e12fffind typename typename в параметре шаблона
#include <iostream>
#include <memory>
using namespace std;
template < typename D >
class Base
{
public:
typedef D EType;
};
template<class T>
struct is_Base
{
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
template<class U>
static constexpr std::true_type test(Base<U> *) { return std::true_type(); }
static constexpr std::false_type test(...) { return std::false_type(); }
using value = decltype(test((T*)0));
};
template < typename A >
using static_passoff = std::integral_constant< bool, A::value >;
template <typename T, typename = typename std::enable_if< static_passoff< typename is_Base<T>::value >::value >::type >
void foo(T const&)
{
}
class Derived : public Base<Derived> {};
class NotDerived {};
int main()
{
Derived d;
//NotDerived nd;
foo(d);
//foo(nd); // <-- Should cause compile error
return 0;
}
'станд :: is_base_of не очень хорошо работает с моим ... stuff'. См. Статью 27 «Эффективный современный C++» Скотта Мейера. Вам нужно 'std :: is_base_of > :: значение'. –
kfsone
@kfsone 'Base' - это шаблон класса. – Barry
Ну, вы поняли мою мысль. См. Http://ideone.com/d3Of8G – kfsone