我的代码中包含以下几行:

//lines in mycode.c++
  QString str = "...some id...";

       if( str == "int")
           foo< int>()
  else if( str == "QString")
           foo< QString>()
       ...

我需要创建一种在此条件语句中包括自定义类型的机制。因此,任何程序员都可以注册其类和foo模板化函数的实现。

我想像这样:
//A.h -- custom class
class A { };

template< >
  void foo< A>() { ... };

DECL( A, "A"); //macro to declare class

我想要 mycode.c++ 中的条件语句,该条件语句将自动考虑类A的帐户声明,因此它将具有其他行:
else if( str == "A")
    foo< A>()

我可以有这样的效果:
//common.h
  void process_id( QString str) {
       if( str == "int")
           foo< int>()
  else if( str == "QString")
           foo< QString>()
       ...
  else if( str == "A") //this lines programmer put manually
           foo< A>();
  }

//mycode.c++
  #include "common.h"

  QString str = "some_id";

  process_id( str);

但是,如果程序员忘记编辑 common.h 文件怎么办?

我想,也许是使用C-宏系统,或者以某种方式进行Qt预编译。可能吗?

最佳答案

我会做这样的事情:

void process_id(QString const & str)
{
   auto it =  g_actions.find(str);
   if ( it != g_actions.end() )
         (it->second)(); //invoke action
}

支持以上内容的框架实现为:
 using action_t = std::function<void()>;

 std::map<QString, action_t>  g_actions; //map of actions!

#define VAR_NAME(x)       _ ## x
#define DEFINE_VAR(x)  VAR_NAME(x)
#define REGISTER(type) char DEFINE_VAR(__LINE__) = (g_actions[#type] = &foo<type>,0)

现在您可以将任何类(class)注册为:
 //these lines can be at namespace level as well!
 REGISTER(A);
 REGISTER(B);
 REGISTER(C);

然后调用process_id()为:
process_id("A"); //invoke foo<A>();
process_id("B"); //invoke foo<B>();

希望能有所帮助。

参见this online demo

关于c++ - 可扩展条件语句的机制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28218374/

10-13 05:04