C ++宏:如何在可识别的字符串文字之前捕获所有内容

时间:2017-08-10 18:05:34

标签: c++ macros

我需要将<unknown_variable_name_before_dot>.NestedObject.转换为static_cast<NestedClass>(<unknown_variable_name_before_dot>.NestedObject).

例如:

Foo foo;
Foo bar;

// I don't know the variable name, but I do know ".NestedObject." will be present
foo.NestedObject.Func();
bar.NestedObject.Func();

// I need to force the call into the following syntax
static_cast<NestedClass>(foo.NestedObject).Func();
static_cast<NestedClass>(bar.NestedObject).Func();

这可能与C宏有关吗?

我希望结果与......类似。

static_cast<NestedClass>(##<unknown_variable_name_before_dot>.NestedObject).

...,但我不知道如何在我确认的字符串部分之前捕获字符串的未知/变量部分。

如果operator .可用,那么我会有类似于......

NestedClass & operator . (void) {
    return *this;
}

目标

目标是允许foo.NestedObject.Func();之类的语法,但在用户不知情/不关心的情况下强制执行static_cast<NestedClass>

2 个答案:

答案 0 :(得分:0)

据推测,你想要做类似

的事情
FUNKY(foo);
FUNKY(bar);

你需要的只是

#define FUNKY(x) static_cast<NestedClass>(x.NestedObject).Func()

由于您没有连接到名称,因此您无需使用##

答案 1 :(得分:0)

看看这里

#include <iostream>
#include <string>

#define DO_VAR(x) _##x.pop_back();    // There has to be something before '##x', you can replace '_' with whatever you want.

int main()
{
    std::string _test = "test";

    DO_VAR(test)

    std::cout << _test << std::endl; // Prints: tes

    return 0;
}

这段代码可以工作并打印出tes,这意味着它真的回到了最后一个角色。

所以你可以创建foo.NestedObject.Func();

但是如果你想在此之前添加强制转换static_cast<NestedClass>,编译器会抛出错误:

  

错误:'NestedClass'没有命名类型#define DO_VAR(x)   static_cast _ ## x.pop_back();

所以我不认为可以使用强制转换来创建它。 C预处理器的功能非常有限。您可以查看m4以获得更强大的预处理器,但您可能会走错路。

所以在我看来,你可以创造最大值

foo.NestedObject.Func();

希望它对你有所帮助。