CRTP 和升压 TTI
CRTP and Boost TTI
我用 gcc 4.9.0 和 clang 3.5.0 测试了以下代码。程序按预期输出 'true'。但是,如果我删除枚举前面的注释,它就会变成 'false'。这里发生了什么?如何确保 has_mem 布尔值设置为 true。我的最终目标是在结构 A 中有一个成员函数,仅当 class T 具有某个成员函数时才通过 enable_if 启用。
#include <iostream>
#include <boost/tti/has_member_function.hpp>
BOOST_TTI_HAS_MEMBER_FUNCTION(func)
template<class T>
struct A
{
//enum : bool { has_mem= has_member_function_func<T,void,boost::mpl::vector<const T &> >::value };
A()
{
std::cout << std::boolalpha
<< has_member_function_func<T,void,boost::mpl::vector<const T &> >::value
<< "\n";
}
};
struct B : public A<B>
{
void func( const B& ) {}
};
int main()
{
B b;
}
我发现以下方法可以解决我的问题。
#include <iostream>
struct empty_ {};
template<class derT>
struct A
{
A( derT * ptr ) : m_ptr( ptr ) {}
//
template<class T=empty_>
void func() { m_ptr->f(); }
private:
derT *m_ptr;
};
struct B : public A<B>
{
B() : A<B>( this ) {}
void f() { std::cout << "B::f\n"; }
};
struct C : public A<C>
{
C() : A<C>( this ) {}
void g() { std::cout << "C::g\n"; }
};
int main()
{
B b;
C c;
b.func();
c.g();
// Does not compile (as disired) since class C does not have a function f()
//c.func();
}
它有效,因为函数 func 是一个模板函数,SFINAE 负责 enable_if 功能。
我用 gcc 4.9.0 和 clang 3.5.0 测试了以下代码。程序按预期输出 'true'。但是,如果我删除枚举前面的注释,它就会变成 'false'。这里发生了什么?如何确保 has_mem 布尔值设置为 true。我的最终目标是在结构 A 中有一个成员函数,仅当 class T 具有某个成员函数时才通过 enable_if 启用。
#include <iostream>
#include <boost/tti/has_member_function.hpp>
BOOST_TTI_HAS_MEMBER_FUNCTION(func)
template<class T>
struct A
{
//enum : bool { has_mem= has_member_function_func<T,void,boost::mpl::vector<const T &> >::value };
A()
{
std::cout << std::boolalpha
<< has_member_function_func<T,void,boost::mpl::vector<const T &> >::value
<< "\n";
}
};
struct B : public A<B>
{
void func( const B& ) {}
};
int main()
{
B b;
}
我发现以下方法可以解决我的问题。
#include <iostream>
struct empty_ {};
template<class derT>
struct A
{
A( derT * ptr ) : m_ptr( ptr ) {}
//
template<class T=empty_>
void func() { m_ptr->f(); }
private:
derT *m_ptr;
};
struct B : public A<B>
{
B() : A<B>( this ) {}
void f() { std::cout << "B::f\n"; }
};
struct C : public A<C>
{
C() : A<C>( this ) {}
void g() { std::cout << "C::g\n"; }
};
int main()
{
B b;
C c;
b.func();
c.g();
// Does not compile (as disired) since class C does not have a function f()
//c.func();
}
它有效,因为函数 func 是一个模板函数,SFINAE 负责 enable_if 功能。