小编qua*_*ant的帖子

我可以评论多行宏吗?

我正在编写一些大的宏,并认为如果我可以为它们添加注释会很好,就像这样:

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL() \ // this does...
  SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

prog.cpp:9:2:错误:在程序中迷路'\'

有什么方法可以解决这个问题,还是不可能对多行宏进行评论?

c++ macros

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

如何使用可变参数模板参数enable_if一个类?

假设我有一个具有以下签名的类:

template <typename T, typename... Args>
class A;
Run Code Online (Sandbox Code Playgroud)

但是这个类的行为应该取决于其他一些参数,让我们说它的值是T::value:

template <typename T, typename... Args, typename Enable>
class A;

template <typename T, typename... Args, typename = typename std::enable_if<T::value>::type>
class A
{
  // do something
};

template <typename T, typename... Args, typename = typename std::enable_if<!T::value>::type>
class A
{
  // do something else
};

int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

但是,此程序会出现以下错误:

prog.cpp:6:11:错误:参数包'Args'必须位于模板参数列表类A的末尾;

我一直在努力寻找有关使用enable_if可变参数模板选择类的信息的良好信息来源.我能找到的唯一问题就是这个问题:

如何将std :: enable_if与variadic模板一起使用

但尽管有这个名字,这个问题及其答案并没有多大帮助.如果有人可以提供或链接有关如何处理此问题的指南以及为什么会对此表示赞赏.

c++ templates

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

lambda是静态的意味着什么?

假设我有一个初始化并使用lambda的二进制搜索功能:

bool const custom_binary_search(std::vector<int> const& search_me)
{
  auto comp = [](int const a, int const b)
    {
      return a < b;
    }
  );

  return std::binary_search(search_me.begin(),search_me.end(),comp);
}
Run Code Online (Sandbox Code Playgroud)

没有指出这是完全多余的,只关注lambda; 每次声明和定义lambda对象是否昂贵?它应该是静态的吗?lambda是静态的意味着什么?

c++ lambda

12
推荐指数
1
解决办法
6962
查看次数

我可以在lambda capture子句中声明一个变量吗?

我想提交一个句柄,但我只希望在共享指针仍然有效时执行它:

// elsewhere in the class:
std::shared_ptr<int> node;

// later on:
const std::weak_ptr<int> slave(node); // can I do this in the capture clause somehow?
const auto hook = [=]()
{
  if (!slave.expired())
    //do something
  else
    // do nothing; the class has been destroyed!
};

someService.Submit(hook); // this will be called later, and we don't know whether the class will still be alive
Run Code Online (Sandbox Code Playgroud)

我可以slave在lambda的capture子句中声明吗?有点像const auto hook = [std::weak_ptr<int> slave = node,=]()....但不幸的是这不起作用.我想避免声明变量然后复制它(不是出于性能原因;我只是认为如果我可以创建lambda需要的任何东西而不污染封闭范围,它会更清晰和更整洁).

c++ c++11 c++14

12
推荐指数
2
解决办法
2576
查看次数

bool在记忆中如何表现?

正如文档中已经讨论过的,bool数据类型占用至少一个字节的内存.之前在SO上问了一个类似的问题(bool类型变量如何存储在内存中?(C++)),但是这个讨论和文档似乎只讨论了布尔数据类型占用的空间量,而不是实际发生的事情.我这样做的记忆:

bool b = true;

那么在记忆中实际发生了什么?7位未用于存储此信息的情况会怎样?标准是否规定了此行为?

他们是不确定的?或者在C++总部有人这样做:

enum bool : char 
{
  false = 0,
  true = 1
};
Run Code Online (Sandbox Code Playgroud)

c++ types boolean

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

如何使用set-window-option使vim样式的键绑定在tmux上运行?

我知道我可以在我的.tmux.conf文件中手动绑定单个键,但是根据这个页面,我应该能够在tmux中获得类似vim的键绑定,只需将以下内容添加到my中.tmux.conf,从而节省了我必须维护一个键绑定列表:

set-window-option -g mode-keys vi

但这似乎并没有像预期的那样发挥作用.果然,当我按下时Ctrl+b [我可以使用vim键导航我的终端历史记录hjkl,但是当我按下Ctrl+b k它时不会将我带到上面的窗口,因为我仍然需要按下Ctrl+b Up,同样适用于向下,向左和向右.

为什么这不起作用?我是否真的必须在vi模式之上手动映射这些键以获得实际的 vi模式?

我正在使用 tmux 1.6

tmux

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

错误:'defaultfloat'不是'std'的成员

std::defaultfloat似乎没有在GCC中定义,尽管符合标准(我认为是§27.5.6.4).我把它分离到了这个简单的程序:

// test.cpp
#include <iostream>                                                             

int main()                                                                      
{                                                                               
    std::cout << std::defaultfloat << 1.3;                                      
    return 0;                                                                   
}
Run Code Online (Sandbox Code Playgroud)

这在VC++ 11中编译.我尝试使用以下两个命令使用g ++ 4.7.2和g ++ 4.9.0编译它:

g ++ test.cpp g ++ test.cpp -std = c ++ 11

我也在这里尝试了GCC 4.8.1的在线编译,总是得到相同的结果:

user@office-debian:~/Documents/test$ g++ test.cpp -std=c++11
test.cpp: In function ‘int main()’:
test.cpp:5:15: error: ‘defaultfloat’ is not a member of ‘std’
  std::cout << std::defaultfloat << 1.3;
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?

debian c++11

10
推荐指数
1
解决办法
3100
查看次数

如何让BOOST_TEST_MESSAGE显示在屏幕上?

我正在通过Boost单元测试框架摸索,并建立了一个基本的功能单元测试.我正在使用BOOST_TEST_MESSAGE,让用户知道哪些测试正在运行,但消息不会显示在屏幕上.例如:

#define BOOST_TEST_MODULE MyTest

#include <boost/test/included/unit_test.hpp>

BOOST_FIXTURE_TEST_SUITE(MyTestSuite, MyTestFixture)

BOOST_AUTO_TEST_CASE(MessageTest)
{
  BOOST_TEST_MESSAGE( "no one sees this!" );
}

BOOST_AUTO_TEST_SUITE_END();
Run Code Online (Sandbox Code Playgroud)

我试过定义BOOST_TEST_LOG_LEVEL,all但这没有效果.我从Boost日志级参数页面得到了这个想法,但我认为日志的概念可能与屏幕上实际显示的内容无关.有任何想法吗?

c++ boost boost-unit-test-framework

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

条件断点:此表达式具有副作用,不会被评估

我有一个非静态const方法调用size_t A::m() const,我想用它来触发一个断点,如果它返回一个大于1的值.这是class A和实例a:

class A
{
public:
    std::vector<double> myvec;
    size_t m() const
    {
      return myvec.size();
    }
} a;
Run Code Online (Sandbox Code Playgroud)

所以我在Visual Studio 2013中添加了这个条件的断点

a.m() > 1 // a is an instance of class A
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试编译它时,我从IDE获得以下消息:

无法设置以下断点:

在myFile.cpp,第xxx行,当'am()> 1'为真时

此表达式具有副作用,不会被评估.

请注意,A::m()它不会修改任何内容,它只调用.size()vector 的方法并返回该值,因此表达式具有副作用的断言完全是假的.实际上,a.myvec.size() > 1(即方法本身的内容)替换断点条件具有相同的效果!

关于什么可以作为断点的条件,微软说 ;

条件可以是调试器可识别的任何有效表达式.

所以我去了调试器中看了一下Expressions,发现了这个:

副作用的一个常见原因是在调试器窗口中评估函数调用.这种评估通常是显而易见的.副作用的一个更微妙的原因是在托管代码中评估属性和其他隐式函数调用.

调试器无法判断属性评估或隐式函数调用是否具有副作用.因此,默认情况下,调试器不会自动计算隐式函数调用.默认情况下允许属性评估,但可以在"选项"对话框中将其关闭.未评估函数调用或属性时,将显示刷新图标.您可以通过单击刷新图标手动评估表达式.有关详细信息,请参见如何:刷新监视值.

关闭属性或隐式函数调用的评估时,可以使用ac格式修饰符强制求值(仅适用于C#).请参阅C#中的格式说明符.

如果有人能将上段翻译成英文,那就太棒了.我可以将函数放入这些调试器条件中吗?

c++ debugging visual-studio-2013

9
推荐指数
2
解决办法
7452
查看次数

我可以禁用SFINAE吗?

假设我有这个程序

struct A
{
  template <typename T>
  static auto fun() -> typename T::type { }
};

struct C
{
    // doh! I forgot to add a typedef for type!
};

int main() {
    A::fun<C>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

实例

auto出于各种原因我可能需要说明符,但上述程序会产生以下错误:

prog.cpp:13:12: error: no matching function for call to ‘A::fun()’
  A::fun<C>();
Run Code Online (Sandbox Code Playgroud)

虽然如此,但它并没有特别有用.在这个例子中很明显我忘了提供一个C::type,但你可以看到,在较大的程序中,这可能会变得非常混乱.

失败的真正原因是在编译器错误消息中埋藏了几行:

prog.cpp:7:15:错误:'struct C'中没有名为'type'的类型

在一个实际的代码库此消息可以是下几百或几千(或数百千)错误消息(和上述同样大的组消息可能已经从另一变化出现)线.考虑到在真实情况下我们可能甚至不知道要寻找什么,这可能会非常混乱.

一个错误告诉我,A因为C::type没有声明失败的声明会更有帮助.

当然有很多情况下SFINAE是有用且必要的,所以我不想以某种方式完全关闭这种语言功能.但是我可以禁用此特定功能的SFINAE规则吗?

换句话说,我可以在函数声明中添加一些东西来强制编译器尝试编译函数,并在发生替换失败时产生错误吗?

c++

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