首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有任何方法来跟踪编译器的模板参数推断?

有没有任何方法来跟踪编译器的模板参数推断?
EN

Stack Overflow用户
提问于 2018-02-16 13:03:01
回答 1查看 413关注 0票数 8

当编译器试图推断模板参数类型时,无论成功与否,我都在寻找从编译器的逻辑中获取一些跟踪日志的方法。例如,给定代码:

代码语言:javascript
复制
#include <iostream>
#include <vector>
#include <type_traits>

template<typename T>
decltype(auto) foo(T&& t) -> decltype(t + t)
{
    return t + t;
}

template<typename T>
decltype(auto) foo(T&& t) -> decltype(t.size()) 
{
    return t.size();
}

int main()
{
    std::cout << foo(10) << '\n'
              << foo(std::vector<int>{1,2,3}) << '\n';
}

我很想收到这样的信息:

代码语言:javascript
复制
foo(10)

candidate: decltype(auto) foo(T&& t) -> decltype(t * t): seems valid
candidate: decltype(auto) foo(T&& t) -> decltype(t.size()): wrong one

编译器已经很擅长它了,例如提供了不明确的调用。如果我打电话给foo(std::string("qwe"));,我会得到:

代码语言:javascript
复制
main.cpp: In function 'int main()':
main.cpp:23:31: error: call of overloaded 'foo(std::__cxx11::basic_string<char>)' is ambiguous
         foo(std::string("qwe"));
                               ^

main.cpp:7:20: note: candidate: decltype ((t + t)) foo(T&&) [with T = std::__cxx11::basic_string<char>; decltype ((t + t)) = std::__cxx11::basic_string<char>]
     decltype(auto) foo(T&& t) -> decltype(t + t)
                    ^~~

main.cpp:13:20: note: candidate: decltype (t.size()) foo(T&&) [with T = std::__cxx11::basic_string<char>; decltype (t.size()) = long unsigned int]
     decltype(auto) foo(T&& t) -> decltype(t.size())
                    ^~~

如果这种明确的反馈是不可能的,也许有一种方法可以查看“半编译”代码,而所有的模板演绎都已经完成了?

任何一个编译器都有这样的特性吗?gcc,嘎嘎,先生?

回溯:

这个例子很简单,也很明显,但是我确实用ranges::v3库做了实验,并且很难理解为什么一个特定的案例可以工作,而另一个则不行。(从技术上讲,iterator_range<Handmade InputIterator>view::take(3)一起使用管道返回void,而不是一些花哨的range,但不是这个问题。我想追踪几乎同一行的演绎,但是用iterator_range<ContiguousIterator>和看到的差别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 13:44:17

灯火是一个基于clang的工具,用于跟踪模板实例化的进度。它有一个类似于gdb调试器的接口,因此您可以专注于某个导致错误的实例化,或者不像预期的那样运行。或者,您可以让它输出模板实例化的“概要文件”,这将给出所有这些实例的概述。

还有一个相关的工具圣殿骑士,这显然是一个图形界面的淡马锡的调试器模式,虽然我还没有尝试它自己。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48827410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档