首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRTP和Boost TTI

CRTP和Boost TTI
EN

Stack Overflow用户
提问于 2015-03-16 14:54:09
回答 1查看 391关注 0票数 1

我用gcc 4.9.0和clang3.5.0测试了以下代码。程序按预期输出“真”。但是,如果我删除枚举前面的注释,它就会变成'false‘。这里发生什么事情?如何确保has_mem布尔值设置为true。我的最终目标是在struct中有一个成员函数,只有当类T有特定的成员函数时,才能通过enable_if启用它。

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-19 12:57:44

我想出了以下方法来解决我的问题。

代码语言:javascript
复制
#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功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29079920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档