我需要将<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>
。
答案 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();
希望它对你有所帮助。