有没有一种方法可以根据用户参数设置功能指针?

时间:2019-09-16 12:09:52

标签: c++ vtable

我有一个版本的代码,带有基准测试包围,并带有启用或禁用宏的宏,并且我想更改无需重新编译代码就可以打开和关闭基准测试设置的代码,并且没有很多if-else或没有代码重复(带有基准的版本和没有基准的版本)?

为正确的功能设置vtable的方法吗?

编辑:添加了我不愿意做的代码示例

EDIT V2 我从答案中了解没有办法,因此,如果我创建两个共享库,我可以在运行时编写要链接到的共享库吗?

#include <iostream>
#include <string>
using namespace std;

struct A
{

   virtual int add(int a,int b)=0;
};

struct B:public A
{
     virtual int add(int a,int b){return a+b;}

};

struct C:public A
{
     virtual int add(int a,int b)
     {
         cout << "time" << endl;
         return a+b;
         }

};


int main(int argc,char* argv[])
{
    A* a;
    string s(argv[1]);
    if(s.compare("t"))
    {
        a = new C;
    }
    else
    {
        a=new B;
    }
    cout << a->add(2,5);
    return 0;    
}

2 个答案:

答案 0 :(得分:1)

  

为正确的功能设置vtable的方法吗?

Vtable是一个实现细节。通常,这种细节的实现方式是由构造函数设置vtable指针。

您可以具有一个接口和一次设置并多次使用的工厂功能指针(也称为Factory design pattern)。例如:

SELECT CarNamesString = STUFF((
         SELECT ',' + [Name]
            FROM tbl_cars 
            FOR XML PATH('')
         ), 1, 1, '')

答案 1 :(得分:0)

您快到了。使用decorator pattern,可以避免代码重复。 对于抽象类A,装饰器的打印时间如下所示:

struct TimedA : public A
{
     TimedA(A* base) : base_(base) {}
     virtual int add(int a,int b)
     {
         cout << "time" << endl;
         return base_->add(a, b);
     }

     A* base_;
};

装饰器的要点是,您可以将其附加到A类型的任何对象上,它将注入其他行为。