C++ 使用宏减少代码重复

C++ 使用宏减少代码重复,c++,C++,我想知道是否有人能给我一个指针来减少编码时的重复 im需要多次调用函数以填充结构,例如: typedef struct { uint16_t u16_a; bool b_org; char* c_c; uint16_t u16_d; } TEntry; Trrelevant::Trrelevant() { TPoint* u_apoint = Insufficient::FindValue("A"); if (u_bpoint != NULL)

我想知道是否有人能给我一个指针来减少编码时的重复

im需要多次调用函数以填充结构,例如:

typedef struct {
    uint16_t u16_a;
    bool b_org;
    char* c_c;
    uint16_t u16_d;

} TEntry;
Trrelevant::Trrelevant()
{
    TPoint* u_apoint = Insufficient::FindValue("A");
    if (u_bpoint != NULL) {
        int a = u_apoint;
    }

    TPoint* p_apoint = Insufficient::FindValue("borg");
    if (p_bpoint != NULL) {
        bool b = p_bpoint;
    }


    TPoint* p_cpoint = Insufficient::FindValue("C");
    if (etc != NULL) {
        char* c = etc;
    }

    TEct* etc = Insufficient::FindValue("ETC");
    if (etc != ETC) {
        etc = etc;
    }

    TEntry entry = {a,
                    b,
                    c,
                    etc};
}
我需要用一个函数调用填充其中的每个值,尽管返回值不同,但所有函数都使用相同的函数。 宏是否足以以某种方式创建模板,以便返回类型取决于特定参数(“字符串”)

例如:

typedef struct {
    uint16_t u16_a;
    bool b_org;
    char* c_c;
    uint16_t u16_d;

} TEntry;
Trrelevant::Trrelevant()
{
    TPoint* u_apoint = Insufficient::FindValue("A");
    if (u_bpoint != NULL) {
        int a = u_apoint;
    }

    TPoint* p_apoint = Insufficient::FindValue("borg");
    if (p_bpoint != NULL) {
        bool b = p_bpoint;
    }


    TPoint* p_cpoint = Insufficient::FindValue("C");
    if (etc != NULL) {
        char* c = etc;
    }

    TEct* etc = Insufficient::FindValue("ETC");
    if (etc != ETC) {
        etc = etc;
    }

    TEntry entry = {a,
                    b,
                    c,
                    etc};
}
这段代码既不编译也不准确,我只是想说明一下。我在C++和新的宏中很弱,但是有人知道宏的解决方法吗?
感谢您抽出时间

最近我也遇到了同样的问题,我不确定您使用什么样的来源来提供信息。 个人而言,我使用XML作为输入。 然后,我有一个Builder类,它解析XML调用工厂函数,用解析器的数据构建C++中的每个结构。 我不认为宏或模板会有任何帮助(或者这是一个糟糕的解决方案)。 请注意,如果您希望在不重新编译的情况下进行更改,那么外部资源(如xml)是很好的选择


最好的

你可以做这样的事情,尽管我不知道它到底给你带来了什么

#define QuickFindValue(NAME, TYPE, FUNCTION)             \
     TYPE *NAME##Value = Insufficient::FindValue(#NAME); \
     if (NAME##Value == NULL) { FUNCTION; }
您可以这样使用它:

QuickFindValue(C, TPoint, { 
  char *c = CValue;
  // Do stuff..
});

最好的选择,不要。宏没有上下文或类型安全感。我不会太担心代码长度。在这种情况下,
不足::FindValue
可能会返回一个
boost::variant
?谢谢你的意见,我只是厌倦了使用函数我想看看宏是否有能力,在你担心让它变得更简单之前,如何让它工作。单个函数不能根据
const char*
表达式(运行时值)的内容更改其返回类型(编译时值)。现在的例子太模糊了,我们不知道你到底想做什么。谢谢你Nathan,那么如果你有一个#NAME和它提供的返回类型的映射,是否也可以支持#type to#NAME映射呢?或者最好在宏之外执行此操作,以便能够将名称映射到返回类型?您可以构建第一个宏并添加两个更快的宏,如下所示:#定义QuickFindValueETC(函数)QuickFindValueETC(ETC,TEtc,函数)#定义QuickFindValueA(函数)QuickFindValueA(函数)QuickFindValueA(A,TPoint,函数)您可以做的另一件事是,如果您对类型进行一致的命名,以便“C”始终具有TC或“ETC”的返回类型始终具有TETC等返回类型。。。您可以基于T##NAME构造返回类型。这样就不需要第二个类型参数了。太好了,我以前没见过这个,谢谢你,内森:)这是一个很好的宏入门资源。请参阅“字符串化和连接”部分。谢谢。如果我找不到解决方案,我会记住xml或函数