如果给定模板参数,是不是有可以将模板类转换为实际类的 C++ 工具? [关闭]

Posted

技术标签:

【中文标题】如果给定模板参数,是不是有可以将模板类转换为实际类的 C++ 工具? [关闭]【英文标题】:Is there a C++ tool which can convert template classes to actual classes if template parameter is given? [closed]如果给定模板参数,是否有可以将模板类转换为实际类的 C++ 工具? [关闭] 【发布时间】:2019-03-06 19:24:08 【问题描述】:

假设我有一个像

这样的模板类
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 和模板参数的工具。

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

【问题讨论】:

【参考方案1】:

我的意思是,编译器会这样做。您扩展为Foo 的类型实际上应该称为Foo&lt;int&gt;,如果您在调试器中单步调试已编译的程序,就会看到这一点。

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


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

https://cppinsights.io

像这样扩展您的原始代码 (link)

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&lt;int&gt;::baz(),只是因为它从未实际使用过。

【讨论】:

谢谢。我一直在寻找这样的工具。我知道我不会使用 STL,而且它的可用性较低。它只是用于学习编译器如何进行类型推导。

以上是关于如果给定模板参数,是不是有可以将模板类转换为实际类的 C++ 工具? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C ++将模板参数转换为其未签名版本

每个可变参数模板参数生成一个类成员

类模板参数

类模板三种类模板参数

如何检查是不是可以从给定类型构造模板类型

可变参数模板类:是不是可以为每个可变参数模板参数实现一个唯一的成员函数?