相关疑难解决方法(0)

在C++ 11中用"auto"推导出lambda的类型是什么?

我有一种感觉,lambda的类型是一个函数指针.当我进行以下测试时,我发现它是错误的(演示).

#define LAMBDA [] (int i) -> long { return 0; }
int main ()
{
  long (*pFptr)(int) = LAMBDA;  // ok
  auto pAuto = LAMBDA;  // ok
  assert(typeid(pFptr) == typeid(pAuto));  // assertion fails !
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是否缺少任何一点?如果不是那么,typeofauto关键字推导出的lambda表达式是什么?

c++ lambda typeof auto c++11

129
推荐指数
4
解决办法
3万
查看次数

用C或C++打印调用堆栈

有没有办法在每次调用某个函数时在C或C++中正在运行的进程中转储调用堆栈?我的想法是这样的:

void foo()
{
   print_stack_trace();

   // foo's body

   return
}
Run Code Online (Sandbox Code Playgroud)

其中的print_stack_trace工作方式类似于callerPerl.

或类似的东西:

int main (void)
{
    // will print out debug info every time foo() is called
    register_stack_trace_function(foo); 

    // etc...
}
Run Code Online (Sandbox Code Playgroud)

在哪里register_stack_trace_function放置某种内部断点,这将导致在调用时打印堆栈跟踪foo.

在某些标准C库中是否存在这样的事情?

我正在使用GCC在Linux上工作.


背景

我有一个测试运行,基于一些不应该影响此行为的命令行开关,行为不同.我的代码有一个伪随机数生成器,我假设它是基于这些开关被不同地调用的.我希望能够使用每组开关运行测试,并查看随机数生成器是否针对每个开关进行不同的调用.

c c++ linux callstack

98
推荐指数
8
解决办法
15万
查看次数

未定义的模板函数引用

我有三个文件.main.cpp的内容是

#include<iostream>
#include<QString>

#include "util.h"

int main()
{
    using Util::convert2QString;

    using namespace std;
    int n =22;
    QString tmp = convert2QString<int>(n);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

util.h

namespace Util
{
    template<class T>
    QString convert2QString(T type , int digits=0);
}
Run Code Online (Sandbox Code Playgroud)

util.cpp

namespace Util
{
    template<class T>
        QString convert2QString(T type, int digits=0)
        {
            using std::string;

            string temp = (boost::format("%1%") % type).str();

            return QString::fromStdString(temp);
        }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下命令编译这些文件时,我得到未定义的引用错误

vickey@tb:~/work/trash/template$ g++ main.cpp  util.cpp -lQtGui -lQtCore  -I. -I/usr/local/Trolltech/Qt-4.8.0/include/QtCore -I/usr/local/Trolltech/Qt-4.8.0/include/QtGui -I/usr/local/Trolltech/Qt-4.8.0/include
/tmp/cca9oU6Q.o: In function `main':
main.cpp:(.text+0x22): undefined reference to `QString …
Run Code Online (Sandbox Code Playgroud)

c++ qt boost undefined-reference

74
推荐指数
2
解决办法
6万
查看次数

为什么typeid.name()使用GCC返回奇怪的字符以及如何使其打印未拼写的名称?

我怎么运行这个main.cpp:

#include <iostream>
#include <typeinfo>

using namespace std;

struct Blah {};

int main() {
  cout << typeid(Blah).name() << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

通过使用GCC 4.4.4版进行编译:

g++ main.cpp
Run Code Online (Sandbox Code Playgroud)

我明白了:

4Blah
Run Code Online (Sandbox Code Playgroud)

在Visual C++ 2008上,我会得到:

struct Blah
Run Code Online (Sandbox Code Playgroud)

有没有办法让它只是打印Blahstruct Blah

c++ gcc g++ rtti

43
推荐指数
5
解决办法
3万
查看次数

lambda被编译成什么类型​​?

据我所知,所有数据类型必须在编译时知道,而lambda不是一个类型.lambda被翻译成anonymous struct with operator()std::function包裹?

例如,

std::for_each(v.begin(), v.end(), [](int n&){n++;});
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

18
推荐指数
3
解决办法
1936
查看次数

在不执行程序的情况下检索C++ 11中的auto类型

我有一些C++ 11代码使用auto推断类型,我必须转换为C++ 98.我将如何转换代码,在实际类型中替换所有实例auto

c++ static-analysis c++11

13
推荐指数
2
解决办法
1546
查看次数

功能到mangle/demangle函数

我以前,这里,已经表明,C++函数不容易在装配表示.现在我有兴趣阅读这种或那种方式,因为callgrind,valgrind的一部分,显示它们已经解组,而在汇编时它们被显示为损坏,所以我想要破坏valgrind函数输出或者取消函数的汇编名称.有没有尝试过类似的东西?我正在查看一个网站,发现以下内容:

 Code to implement demangling is part of the GNU Binutils package; 
see libiberty/cplus-dem.c and include/demangle.h.
Run Code Online (Sandbox Code Playgroud)

有人曾尝试过类似的东西,我想在C中进行demangle/mangle吗?我的编译器是gcc 4.x.

c c++ assembly function name-mangling

11
推荐指数
2
解决办法
1万
查看次数

如何查看模板类型参数的推导类型?

是否有一种简单的方法可以强制编译器向我显示模板参数的推导类型?例如,给定

template<typename T>
void f(T&& parameter);

const volatile int * const pInt = nullptr;
f(pInt);
Run Code Online (Sandbox Code Playgroud)

我可能想看看T在调用中推断出什么类型f.(我想是的const volatile int *&,但我不确定.)或者给予

template<typename T>
void f(T parameter);

int numbers[] = { 5, 4, 3, 2, 1 };
f(numbers);
Run Code Online (Sandbox Code Playgroud)

我可能想看看我的猜测,T推断为int*在该呼叫f是正确的.

如果有第三方库解决方案(例如,来自Boost),我有兴趣了解它,但我也想知道是否有一种简单的方法可以强制进行包含推导类型的编译诊断.

c++ templates c++11

10
推荐指数
3
解决办法
2209
查看次数

typeinfo/typeid输出

我目前正在尝试调试一段简单的代码,并希望看到特定的变量类型在程序中如何变化.

我正在使用typeinfo头文件,所以我可以使用typeid.name().我知道typeid.name()是特定于编译器的,因此输出可能不是特别有用或标准.

GCC假设存在一个typeid输出符号列表,我正在使用但是我找不到尽管搜索的潜在输出列表.我不想根据输出进行任何类型的转换或操纵任何类型的数据,只需按照其类型.

#include <iostream>
#include <typeinfo>

int main()
{ 
    int a = 10;
    cout << typeid(int).name() << endl;
}
Run Code Online (Sandbox Code Playgroud)

在任何地方都有符号列表吗?

c++ gcc types

9
推荐指数
1
解决办法
7862
查看次数

可以在类型或非类型上进行模板化吗?

我使用了很多模板,偶尔很难弄清楚究竟是什么类型的.我想编写一个实用程序,为每个类型提供一个漂亮,漂亮的字符串名称 - typeid()只是不切割它.例如,如果我只有一个vector<int>,我的盒子上的gcc.4.6.4会生成以下带有typeid:

St6vectorIiSaIiEE
Run Code Online (Sandbox Code Playgroud)

虽然我理想的想要

std::vector<
    int,
    std::allocator<
        int
    >
>
Run Code Online (Sandbox Code Playgroud)

我已经编写了可以在类型上使用任何类型或模板的东西,但只提供了两个模板:

template <typename T> struct simple_type_name;
template <template <typename....> class T> struct template_type_name;
Run Code Online (Sandbox Code Playgroud)

哪些专业intstd::vector可以帮助我建立我想要的字符串.我还有一个部分专业化,simple_type_nameBase<Args...>需要遍历所有的args并做适当的事情.只要所有模板都是类型,这对于intvector<int>任何任意复杂的模板来说都是完全正常的.

如果有帮助,我的"完整模板"版本如下所示:

template <template <typename...> class Base, typename... Args>
struct simple_type_name<Base<Args...>>
{
    static std::string name(int indent = 0) {
        std::string base = template_type_name<Base>::name(indent);
        std::string args[] = { simple_type_name<Args>::name(indent + 4)... } ;

        // basic string putting together stuff here that is less …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

8
推荐指数
2
解决办法
732
查看次数