如何在gdb中调用模板成员函数?

时间:2018-03-29 14:17:12

标签: c++ gdb

我试图在rval引用的gdb(我认为版本7.6.1)中打印模板化成员函数的返回值,所以我在gdb中写的内容总是这样:

gdb> print (*(TypeOne*)var).get<TypeTwo>()

我已尝试将表达式的各个部分括起来但没有成功,我无法找到任何其他问题。有人知道吗?

1 个答案:

答案 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 中调用它,否则这将不起作用。