C++ CRTP-“;“摘要”;静态接口中的方法

C++ CRTP-“;“摘要”;静态接口中的方法,c++,c++11,crtp,C++,C++11,Crtp,我正试图找出一些方法来强制基本CRTP类和派生类之间的契约。使用动态多边形RHPISM时,可以简单地执行以下操作: struct foo{ virtual bar() = 0; }; 编译器将确保方法bar在派生类中实现,否则它将给出(或多或少)有意义的错误消息。现在,我能用CRTP得到的最好结果是: template<class Derived> struct base { void stuff(){ static_cast<Derived

我正试图找出一些方法来强制基本CRTP类和派生类之间的契约。使用动态多边形RHPISM时,可以简单地执行以下操作:

struct foo{
    virtual bar() = 0;
};
编译器将确保方法
bar
在派生类中实现,否则它将给出(或多或少)有意义的错误消息。现在,我能用CRTP得到的最好结果是:

template<class Derived>
struct base {
    void stuff(){
        static_cast<Derived &>(*this).baz();  
    }
};
模板
结构基{
空的东西{
静态_cast(*this).baz();
}
};

它将以某种方式强制在派生类中实现
baz
,但并不真正可读,也不清楚基类和派生类之间的契约是什么。所以我的问题是,有没有更好的方法?我知道C++20的概念,它们将是这种情况下的完美解决方案,但我正在寻找C++11/C++14的解决方案,以使其尽可能干净。

由于定义基时派生类总是不完整,因此我使用的一个解决方案是使用默认模板参数延迟“概念检查”实例化:

template<class T>
using has_baz = decltype(std::declval<T&>().baz());

template<class Derived>
struct base{
  template<class T = Derived, has_baz<T>* =nullptr>
  void stuff(){/*...*/}
  };
模板
使用has_baz=decltype(std::declval().baz());
模板
结构基{
模板
void stuff(){/*…*/}
};
注意,c++20概念不会解决这个特殊问题,延迟概念检查仍然是必要的。优点是编译错误会更清楚


您可以使用派生的函数指针实例化来检查编译时是否存在实现。如果不是dupe:More:@πάνταῥεῖ 你能举个例子回答吗?我不明白你的意思