首页 > 解决方案 > 如果给定模板参数,是否有可以将模板类转换为实际类的 C++ 工具?

问题描述

假设我有一个模板类

template<class T> class Foo{
    T a;
    auto baz(){
        return 4.2f;
    }
};

int main(){
    Foo<int> bar;
    return 0;
}

是否有可以将此代码转换为实际类并提供输出的工具:

class Foo{
    int a;
    float baz(){
        return 4.2f;
    }
};
// main goes below this line

用推导类型替换所有auto参数和模板参数的工具。

我正在使用模板,并且很好奇是否有任何这样的工具可以很好地学习类型推断?

标签: c++templatesc++17compiler-options

解决方案


我的意思是,编译器会这样做。您扩展为的类型Foo实际上应该被称为Foo<int>,如果您在调试器中单步执行已编译的程序,您将看到这一点。

不过,我不知道有任何工具可以进行文本扩展,而且我很确定我不会喜欢为任何非平凡的程序阅读它的输出,尤其是使用标准库容器的程序。


编辑- 好的,这仍然是题外话,但是,因为我已经回答了,这似乎是相关的:

https://cppinsights.io

像这样扩展您的原始代码(链接

template<class T> class Foo{
    T a;
    auto baz(){
        return 4.2f;
    }
};

/* First instantiated from: insights.cpp:9 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
class Foo<int>
{
  int a;
  inline auto baz();

  // inline Foo() noexcept = default;
  // inline constexpr Foo(const Foo<int> &) = default;
  // inline constexpr Foo(Foo<int> &&) = default;
};

#endif


int main()
{
  Foo<int> bar = Foo<int>();
  return 0;
}

你会注意到它永远不会发出Foo<int>::baz()你想要的,只是因为它从未真正使用过。


推荐阅读