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

C++ 如何在gdb中调用模板成员函数?,c++,gdb,C++,Gdb,我试图在右值引用的gdb(我想是7.6.1版)中打印模板成员函数的返回值,因此我在gdb中编写的内容大致如下: gdb> print (*(TypeOne*)var).get<TypeTwo>() gdb>print(*(TypeOne*)var.get() 我试着在表达式的各个部分插入括号,但没有成功,我也找不到关于这个问题的任何其他问题。有人知道吗?从这篇相关文章开始: 我能够在我自己的程序中解决这个问题。 我没有使用右值或变体,所以它可能不适用于这个问题,但我认为它仍

我试图在右值引用的gdb(我想是7.6.1版)中打印模板成员函数的返回值,因此我在gdb中编写的内容大致如下:

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

我试着在表达式的各个部分插入括号,但没有成功,我也找不到关于这个问题的任何其他问题。有人知道吗?

从这篇相关文章开始:

我能够在我自己的程序中解决这个问题。 我没有使用右值或变体,所以它可能不适用于这个问题,但我认为它仍然与这个问题相关

我的用例是一个使用单个枚举作为模板参数的方法,类似于:

#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;
}
如果要调用此方法:

    int getValue<(MyEnum)1>(void);
int-getValue(void);
我们可以使用单引号中所示的名称来调用它

(gdb) p test.'getValue<(MyEnum)1>'()                             
$1 = 9
(gdb)p测试'getValue'()
$1 = 9
您可以在这里尝试:

另一个线程的注释:

如果源代码中没有显式实例,编译器会将模板代码视为“静态内联”代码,并在未使用时对其进行优化


因此,您必须在代码中的某个地方调用该方法才能在gdb中调用它,否则将无法工作。

TypeOne是std::variant成员的包装器,get函数只调用该成员上的std::get。如何使用std::variant成员实现这一点?当然,您应该能够在gdb中调用函数,您可以调用函数(尽管有很多警告),但是模板是有问题的,使用普通模板函数,您必须将其包含在单引号中,我想,虽然我绝对不是gdb高手…安可能会更快地给你答案。可能是重复的
(gdb) p test.'getValue<(MyEnum)1>'()                             
$1 = 9