小编Loo*_*oom的帖子

用括号召唤ctor

关于C++ 11语法的简单问题.有一个示例代码(从代码减少一个)

struct Wanderer
{
  explicit Wanderer(std::vector<std::function<void (float)>> & update_loop)
  {
    update_loop.emplace_back([this](float dt) { update(dt); });
  }
  void update(float dt);
};

int main()
{
  std::vector<std::function<void (float)>> update_loop;
  Wanderer wanderer{update_loop}; // why {} ???
}
Run Code Online (Sandbox Code Playgroud)

我想知道,如何用大括号调用构造函数,Wanderer wanderer{update_loop};它既不是初始化列表,也不是统一初始化.这是什么东西?

c++ constructor c++11

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

C++ - 循环依赖(在模板化基类中使用内部类型的子类)

我在模板化的类中遇到了循环依赖的问题.有一个代码示例:

template <typename T> struct A 
{
  typedef typename T::C D;
  //typename T::C c;
};

struct B : public A<B>
{
  struct C {};
};
Run Code Online (Sandbox Code Playgroud)

当我尝试实例化B时,我得到一个编译器错误:'C'不是'B'(MSVC)的成员无效使用不完整类型'struct B'(GCC).
更改样本以使其工作的最佳方法是什么?

c++ templates circular-dependency crtp incomplete-type

7
推荐指数
1
解决办法
233
查看次数

如何初始化const循环引用成员

例如,我有两个班

class Foo;
class Bar;

class Foo {
  const Bar &m_bar;
  ...
};

class Bar {
  const Foo &m_foo;
  ...
};
Run Code Online (Sandbox Code Playgroud)

让我们foo为对象Foobar为对象Bar.有什么办法(正常或"黑客")创建/初始化foobar其成员m_bar,并m_foo会互相引用(我的意思foo.m_barbarbar.m_foo是"富")?

允许添加任何成员,FooBar为其添加父项,以使其成为模板等.

c++ initialization circular-dependency circular-reference member-initialization

6
推荐指数
1
解决办法
572
查看次数

通过vim中的':'将行的行放到剪贴板中

我正在向vim中的系统剪贴板行使各种行.我可以做到51gg116"+yy.我想通过:符号来做.我可以""通过命令复制到注册:51,116y.但是,命令51,116"+y不起作用.如何修复最后一个命令?

vim editor yank

6
推荐指数
1
解决办法
929
查看次数

正确关闭WinAPI HANDLEs(避免重复关闭)

我有一些处理,我需要关闭它.代码中有一些地方可以关闭句柄.那么,这是一个正确的关闭方式吗?

HANDLE h;
....
if ( h != INVALID_HANDLE_VALUE ) {
  ::CloseHandle(h);
  h = INVALID_HANDLE_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

关于位图句柄有一个相同的问题:

HBITMAP hb;
....
if ( hb != INVALID_HANDLE_VALUE ) {
  ::DeleteObject(hb);
  hb = INVALID_HANDLE_VALUE;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我想,有一些误解.我知道CloseHandle是关闭手柄.我想知道关闭手柄的正确方法.删除指针时会出现类似的情况.

Foo *foo = new Foo();

// for example there is 2 functions that can delete foo
void bar() {
  ....
  delete foo;
}
void duck() {
  ....
  delete foo;
}
Run Code Online (Sandbox Code Playgroud)

因此,以下代码意味着问题:

bar();
duck();
Run Code Online (Sandbox Code Playgroud)

这种情况有一些解决方法.我们需要定义bar和这样的duck函数:

void bar() {
  ....
  if (foo) …
Run Code Online (Sandbox Code Playgroud)

c++ winapi handle hbitmap

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

G ++找不到boost库

我不擅长命令行编译.我的问题是无法编译简单的项目,这取决于Boost.以下是我尝试的日志:

$ g++ -Wall test.cpp -o main
/tmp/ccCTvBYE.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cpp:(.text+0x6b): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x77): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x83): undefined reference to `boost::system::system_category()'
/tmp/ccCTvBYE.o: In function `boost::asio::error::get_system_category()':
test.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[_ZN5boost4asio5error19get_system_categoryEv]+0x5): undefined reference to `boost::system::system_category()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

所以,还有我发现添加指令-lboost_system-lboost_system-mt.我得到以下内容:

$ g++ -lboost_system -Wall test.cpp -o main                                                                                                                    
/usr/bin/ld: cannot find -lboost_system
collect2: error: ld returned 1 exit status

$ g++ -lboost_system-mt -Wall test.cpp -o main                                                                                                                 
/usr/bin/ld: cannot find -lboost_system-mt
collect2: …
Run Code Online (Sandbox Code Playgroud)

c++ boost g++ linker-errors ld

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

用于C++的vim中的Doxygen风格的注释

我想自动插入C++文件的注释片段.谷歌搜索建议c.vim插件.我安装了它.现在,当我创建一个文件时,我会得到如下的模板.

 /* =====================================================================================
  *
  *       Filename:  Foo.h
  *
  *    Description:  :
  *
  *        Version:  1.0
  *        Created:  04/14/2014 08:35:44 PM
  *       Revision:  none
  *       Compiler:  gcc
  *
  *         Author:  YOUR NAME (), 
  *   Organization:  
  *
  * =====================================================================================
  */
Run Code Online (Sandbox Code Playgroud)

:h csupport我捕获,我可以创建自己的评论模板.是否有更简单的方法在项目中获得doxygen风格的评论?或者这些模板可能在某处可用?

vim comments doxygen editor

5
推荐指数
2
解决办法
4979
查看次数

如何压缩大型switch语句

我有一个像下面的大开关:

public int procList(int prov, ArrayList<TXValue> txValueList, Context context)
{
    switch(prov)
    {
    case Foo.PROV_ONE:
        return proc_one(txValueList, context);

    case Foo.PROV_NOE:
        return proc_noe(txValueList, context);

    case Foo.PROV_BAR:
        return proc_bar(txValueList, context);

    case Foo.PROV_CABAR:
        return proc_cabar(txValueList, context);

    case Foo.PROV_FAR:
        return proc_far(txValueList, context);

    case Foo.PROV_TAR:
        return proc_tar(txValueList, context);

    case Foo.PROV_LBI:
        return 408;

    default:
        return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

在c ++中,我可以std::map<Foo, some_function_ptr>按照以下方式使用和使用它:

map[prov](txValueList, context); 
Run Code Online (Sandbox Code Playgroud)

Java中没有指向函数的指针.但是,它使用抽象类,就像它在答案中一样.那么,有没有一种最好的方法来消除switchjava中的大条款?

java switch-statement

5
推荐指数
1
解决办法
720
查看次数

除法("/")在功能上

我正在尝试编写一个简单的除法函数,但是我得到了一个错误

PS C:\Users\john> Function Div($x, $y) { $x / $y }
PS C:\Users\john> Div (1, 1)
Method invocation failed because [System.Object[]] doesn't contain a method named 'op_Division'.
At line:1 char:28
+ Function Div($x, $y) { $x / <<<<  $y }
    + CategoryInfo          : InvalidOperation: (op_Division:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
Run Code Online (Sandbox Code Playgroud)

我的错是什么?谢谢

powershell function syntax-error argument-passing

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

在vim中删除光标右/左部分

让光标定位在vim中单词的某个内部符号上.我想从光标的左侧(或右侧)删除部分单词.如何做(在正常模式和插入模式下)?

vim

4
推荐指数
1
解决办法
658
查看次数