gpt4 book ai didi

c++ - 可扩展条件语句的机制

转载 作者:行者123 更新时间:2023-11-30 00:49:24 24 4
gpt4 key购买 nike

我的代码中有这些行:

//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-macros系统,或者Qt-precompilation。可能吗?

最佳答案

我会做这样的事情:

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)

现在您可以将任何类注册为:

 //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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com