什么是C++;运行时概念? 我最近在网上查看了关于C++概念的细节,发现了几篇关于几篇论文叫“.'”的参考,它们与编译时概念有什么不同,为什么它们被首先介绍,它们将如何实现,以及为什么它们对C++的未来很重要?通过浏览这些论文,我大致了解到运行时概念是为了缓解当前存在于面向对象代码和泛型代码之间的紧张关系,但我没有从中获得太多其他信息

什么是C++;运行时概念? 我最近在网上查看了关于C++概念的细节,发现了几篇关于几篇论文叫“.'”的参考,它们与编译时概念有什么不同,为什么它们被首先介绍,它们将如何实现,以及为什么它们对C++的未来很重要?通过浏览这些论文,我大致了解到运行时概念是为了缓解当前存在于面向对象代码和泛型代码之间的紧张关系,但我没有从中获得太多其他信息,c++,runtime,generic-programming,type-erasure,c++-concepts,C++,Runtime,Generic Programming,Type Erasure,C++ Concepts,这是我对正在发生的事情的理解。它从另一个角度开始:类型擦除 std::function是类型擦除类的一个示例。它采用了“无参数调用,不返回任何内容”的概念,以及“复制构造”和“销毁”的辅助概念,并将其封装到一个整洁的小包中 所以你可以 void groot () { std::cout << "I am groot!\n"; } std::function<void()> f = groot; f(); 这里我们有复制、销毁和调用三个概念,每个概念都表示为一个纯虚拟函数

这是我对正在发生的事情的理解。它从另一个角度开始:类型擦除

std::function
是类型擦除类的一个示例。它采用了“无参数调用,不返回任何内容”的概念,以及“复制构造”和“销毁”的辅助概念,并将其封装到一个整洁的小包中

所以你可以

void groot () { std::cout << "I am groot!\n"; }
std::function<void()> f = groot;
f();
这里我们有复制、销毁和调用三个概念,每个概念都表示为一个纯虚拟函数

template<class Sig>
struct function;
template<class R, class... Args>
struct function<R(Args...)> {
  std::unique_ptr<func_type_eraser<R(Args...)>> pImpl;
  // invoke:
  R operator()( Args... args ) const {
    return (*pImpl)( std::forward<Args>(args)... );
  }
  // destroy:
  ~function() = default;
  // copy:
  function(function const& o) : pImpl( o.pImpl ? o.pImpl->clone() : nullptr ) {}
  // move:
  function(function&&) = default;
  // TODO: operator=

  // technical issues, ignore:
  function(function& o) : function(const_cast<function const&>(o)) {}
  function(function const&& o) : function(o) {}

  // type erase:
  template<class T>
  function(T&& t) : pImpl( new func_type_eraser_impl<R(Args...), std::decay_t<T>>{std::forward<T>(t)} )
  {}
};
…在这里,我们为特定类型的
T
实现了
func\u type\u橡皮擦
中公开的概念接口

现在我们有4个概念,其中3个是类型擦除的,一个由常规类型包装器处理,我们可以存储支持这3个概念的任何内容

我们可以更进一步:

我们甚至可以支持客户端提供的任何功能来支持这些概念

最简单的方法是在允许ADL(参数相关查找)的上下文中调用自由函数,如
std::begin

让我们的类型擦除实现代替直接与对象交互,而是在ADL上下文中调用free函数

提供该函数的默认实现,它可以执行从“失败”到“检查方法
.begin()
并调用它”或“执行低效版本”或“检查传递的类型的属性,并确定执行任务的合理方式”的任何操作

通过这种技术,我们可以允许客户机扩展我们的类型擦除,并使用更广泛的概念


作为一个具体的例子,假设我们的概念是可打印的。有些东西是可打印的,如果它有
ostream,如果他们不能解释它以便它可以理解,那么它是。。。不重要;-)对我来说,他们听起来像是真正喜欢用ObjectiveC编程的人,但从未接触过这种语言。相反,他们试图将一些灵活性移植到C++中,而不质疑对语言的普遍持有的信念。因为这是他们知道的语言。如果他们同时知道ObjectiveC和C++,他们将简单地使用C++,这种方式与C++程序中常见的方式完全不同,而不是试图通过修复语言来解决问题。因此,它们只会导致语言的特征膨胀…@Cheerrsandhth.-Alf:我不知道…听起来对我很重要。@cmaster:让它们修补一下;一旦斯威夫特出现一段时间,Objective-C最终将被弃用。我真的认为这是个很好的主意。现在要是他们能更好地解释一下就好了……嗯,你懂类型擦除吗?这似乎是很多。然后是一些关于揭开类型擦除面纱的内容,允许算法访问底层数据(基本上是执行类型擦除的算法),同时允许客户端类型提供此类改进。和一个概念框架来封装所有这些,类似于传入的C++编译时概念模型。请注意,类型擦除不仅仅是
std::function
,而是从那里开始的。或者我倒过来了:类型擦除就是如何将一个具体的类型,连同要擦除的概念一起,创建一个运行时类型擦除实例。
template<class Sig>
struct function;
template<class R, class... Args>
struct function<R(Args...)> {
  std::unique_ptr<func_type_eraser<R(Args...)>> pImpl;
  // invoke:
  R operator()( Args... args ) const {
    return (*pImpl)( std::forward<Args>(args)... );
  }
  // destroy:
  ~function() = default;
  // copy:
  function(function const& o) : pImpl( o.pImpl ? o.pImpl->clone() : nullptr ) {}
  // move:
  function(function&&) = default;
  // TODO: operator=

  // technical issues, ignore:
  function(function& o) : function(const_cast<function const&>(o)) {}
  function(function const&& o) : function(o) {}

  // type erase:
  template<class T>
  function(T&& t) : pImpl( new func_type_eraser_impl<R(Args...), std::decay_t<T>>{std::forward<T>(t)} )
  {}
};
template<class R, class... Args, class T>
struct func_type_eraser_impl<R(Args...), T> : func_type_eraser<R(Args...)> {
  // type erase storage:
  T t;
  // invoke:
  virtual R operator()(Args... args) const override {
    return t( std::forward<Args>(args)... );
  }
  // copy:
  virtual func_type_eraser_impl* clone() const override {
    return new func_type_eraser_impl{t};
  }
  // destroy:
  virtual ~func_type_eraser_impl() {}
};