我试图在rval引用的gdb(我认为版本7.6.1)中打印模板化成员函数的返回值,所以我在gdb中写的内容总是这样:
gdb> print (*(TypeOne*)var).get<TypeTwo>()
我已尝试将表达式的各个部分括起来但没有成功,我无法找到任何其他问题。有人知道吗?
答案 0 :(得分:0)
从这个相关帖子开始:How to `print`/evaluate c++ template functions in gdb
我能够弄清楚如何在我自己的程序中做到这一点。 我没有使用右值或变体,所以它可能不适用于那个,但我认为它仍然与这个问题相关。
我的用例是一个以单个枚举作为模板参数的方法,类似于:
#include <stdio.h>
enum class MyEnum {
VALUE_0 = 0,
VALUE_1 = 1
};
struct TestStruct {
template <MyEnum VALUE>
int getValue() {
if constexpr (VALUE == MyEnum::VALUE_0) {
return value_0;
} else /* VALUE == MyEnum::VALUE_1 */ {
return value_1;
}
}
const int value_0 = 7;
const int value_1 = 9;
};
int main()
{
TestStruct test;
test.template getValue<MyEnum::VALUE_0>();
test.template getValue<MyEnum::VALUE_1>();
return 0;
}
如果我们在对象上使用 ptype
,我们会得到一个对象的方法列表:
(gdb) b 36
Breakpoint 1 at 0x4004f7: file main.cpp, line 36.
(gdb) r
Starting program: /home/a.out
Breakpoint 1, main () at main.cpp:36
36 return 0;
(gdb) ptype test
type = struct TestStruct {
const int value_0;
const int value_1;
public:
int getValue<(MyEnum)1>(void);
int getValue<(MyEnum)0>(void);
}
如果我们想调用这个方法:
int getValue<(MyEnum)1>(void);
我们可以使用如图所示的名称来调用它,用单引号括起来。
(gdb) p test.'getValue<(MyEnum)1>'()
$1 = 9
您可以在这里尝试:https://onlinegdb.com/7OtaUvK3g
来自其他线程的注释:
<块引用>如果源代码中没有显式实例,编译器会将模板代码视为“静态内联”代码,并在未使用时对其进行优化。
因此,您必须在代码中的某处调用该方法,以便能够在 gdb 中调用它,否则这将不起作用。