Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++/Boost模板运行时多态性_C++_Boost - Fatal编程技术网

C++ C++/Boost模板运行时多态性

C++ C++/Boost模板运行时多态性,c++,boost,C++,Boost,不知道如何清楚地陈述主题 假设我有一堆函子类,它们提供了一些方法。现在,我想创建一个代理类,它将方法调用重定向到一个底层functor 例如: 模板 类代理\u impl:proxy{ F; void方法(){f.method();} }; 模板 类代理\u impl{ 虚空方法()=0; }; 类代理{ 自动执行; 模板 proxy(F):impl_u(新的proxy_impl(F)){ void方法(){ impl->method(); } }; 这个模式叫什么?boost有实现吗 不让函

不知道如何清楚地陈述主题

假设我有一堆函子类,它们提供了一些方法。现在,我想创建一个代理类,它将方法调用重定向到一个底层functor

例如:

模板
类代理\u impl:proxy{
F;
void方法(){f.method();}
};
模板
类代理\u impl{
虚空方法()=0;
};
类代理{
自动执行;
模板
proxy(F):impl_u(新的proxy_impl(F)){
void方法(){
impl->method();
}
};
这个模式叫什么?boost有实现吗

不让函子直接继承的原因是,函子可以类似于一个无名的lambda表达式


好的,看来我需要一个类似boost::any和boost::function的功能。

看起来你在试图重新发明基于对象的多态性。。。糟透了

这是你想做的事

class interface { virtual void method()=0; }
class impl1 : public interface { void method(); }
class impl2 : public interface { void method(); }

...//example usage
interface i *;
if (cond) i = new impl1(); else i= new impl2();
i->method();//calls whichever implementing method was constructed.

看起来很像我不太明白。。似乎您只想将函子链接在一起:

struct null_functor { void method() { }; };

template <typename F = null_functor>
struct functor1 {
  F f;
  void method() { 
    std::cout << "functor1 called!" << std::endl;
    f.method();
  };
};

template <typename F = null_functor>
struct functor2 {
  F f;
  void method() { 
    std::cout << "functor2 called!" << std::endl;
    f.method();
  };
};

int main() {
  functor1 f1;
  f1.method();

  functor1< functor1 > f11;
  f11.method();

  functor2< functor1 > f21;
  f21.method();

  return 0;
};
struct null_函子{void method(){};};
模板
结构函子1{
F;
void方法(){

std::cout正如您所建议的,这可以通过boost.any和boost.function实现。具体来说:

struct proxy {
  template <typename T>
  proxy(T t) : obj_(t) {
    method = [&obj_] { boost::any_cast<T&>(obj_).method(); }
  }
  boost::function<void()> method;
private:
  boost::any obj_;
};
struct代理{
模板
代理(T):对象(T){
method=[&obj_]{boost::any_cast(obj_).method();}
}
boost::函数法;
私人:
boost::任何对象;
};

If
.method()
是const,那么你可以去掉boost::any,让lambda通过值捕获
T
对象。事实上,在这种情况下,你可以去掉代理对象,只使用一个简单的boost::函数。

你不需要
方法
来实现虚拟化。我对此感到困惑了一段时间,我认为你在做些什么太奇怪了,我觉得不值得费心去理解它,这对它未来的可维护性来说是个坏兆头。你可能会碰巧尝试实现“信封/字母”或“句柄/正文”模式吗?我不想继承。我想要没有DEP的独立函子。@aaa你到底为什么要这样做?如果你想要运行时polymorphism,使用继承。这就是它的用途。这有点像c-with-objects的全部要点。如果你想要编译时多态性,你应该问一下。不管怎样,你的例子是怎么做的,只是简单地调用
proxy.method()
不需要?因为我特别不想在函子中继承,原因有几个,其中一个函子是无名的lambda表达式。嗯,是的。唯一的问题是我需要返回绑定的“proxy”对象。
struct proxy {
  template <typename T>
  proxy(T t) : obj_(t) {
    method = [&obj_] { boost::any_cast<T&>(obj_).method(); }
  }
  boost::function<void()> method;
private:
  boost::any obj_;
};