小编iFr*_*cht的帖子

如何捕获lambda的列表实际上在C++ 11中工作?

我知道捕获列表使变量在lambda函数体内可用,如下所示:

int pos(0);
std::function<void()> incPos = [&pos](){ ++pos; };
incPos(); //pos is now 1
Run Code Online (Sandbox Code Playgroud)

但是,捕获实际上如何在编译器级别上工作?捕获的地址或捕获的值存储在哪里?

c++ lambda c++11

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

我是否必须手动为比较运算符实现可交换性?

n个不同的类,它们都应该与之相当,operator==并且operator!=有必要手动实现(n ^ 2 - n)*2个运算符.(至少我认为这是一个术语)

三个班级将是12个,四个班级为24个.我知道我可以用其他运算符来实现很多这样的运算符:

operator==(A,B); //implemented elsewhere

operator==(B,A){ return A == B; }

operator!=(A,B){ return !(A == B); }
Run Code Online (Sandbox Code Playgroud)

但它似乎仍然很乏味,特别是因为它A == B总会产生相同的结果,B == A并且似乎没有任何理由来实现它们的两个版本.

有没有解决的办法?难道我真的要落实A == BB == A手动?

c++ comparison operator-overloading c++11

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

删除构造函数是继承的吗?

使用该关键字delete可以防止编译器自动添加某些构造函数的标准实现.

这个删除是继承到子类吗?

c++ inheritance constructor c++11

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

使用.d.ts文件中的类型定义而不导入

我正在将Web应用程序从普通Javascript迁移到Typescript,并使用--outFile编译器选项和/// <reference path="..."/>指令将所有单独的文件编译为单个文件.

这很好,因为我可以将我的代码分成多个文件,而不必担心浏览器支持import.

我使用的一个库是color-js,它在一个名为的文件中有类型定义color.d.ts.

要使用普通的Javascript,我会执行以下操作:

index.html的:

[...]
<script src="scripts/color-js/color.js"></script>
<script src="main.js"></script> 
[...]
Run Code Online (Sandbox Code Playgroud)

main.js/main.ts

let Color = net.brehaut.Color;
[...]
Run Code Online (Sandbox Code Playgroud)

在运行时,这也适用于Typescript,但在编译期间,我得到如下错误:

scripts/cue.ts(4,13): error TS2304: Cannot find name 'net'. 
scripts/cue.ts(25,18): error TS2304: Cannot find name 'Color'. 
scripts/cue.ts(26,16): error TS2304: Cannot find name 'Color'.` 
scripts/cue.ts(27,19): error TS2304: Cannot find name 'Color'. 
scripts/main.ts(839,52): error TS2304: Cannot find name 'Color'. 
scripts/main.ts(1019,20): error TS2304: Cannot find name 'Color'. 
scripts/main.ts(1022,16): error TS2304: Cannot find name 'Color'.
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用类型定义 …

javascript import types typescript tsc

7
推荐指数
2
解决办法
1305
查看次数

为什么在这个类定义中不需要空参数列表?

当仅使用标准类型参数实例化具有模板化类类型的变量时,语法如下所示:

template<typename Arg = int>
class Templ;

Templ<>& myTempl;
Run Code Online (Sandbox Code Playgroud)

省略空参数列表<>应该给出编译错误,因为需要模板参数列表.

但很显然,(至少在VS2013),下面的声明中没有需要的模板参数列表:

template<typename Arg> //" = int" left out
class Templ{
    Templ& myTempl; //no <> here
};
Run Code Online (Sandbox Code Playgroud)

但为什么这有效呢?根据IntelliSense,Templ<int>编译器选择了正确的type(),因此它按预期工作,但成员声明是否仍然需要空参数列表?

编辑:不,它没有按预期工作.我没有仔细检查.当悬停在线上时Templ<short>::myTempl,IntelliSense会显示其类型short.

c++ templates class visual-studio c++11

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

IntelliSense解析时是否定义了宏?

每个编译器都有一个像__BORLANDC__定义的宏,使程序员能够激活或停用某些行为或变通方法.

在IntelliSense解析文件时是否定义了这样的宏,以便我可以激活bug的变通方法?

#if defined __INTELLISENSE__
#define SOMETHING
#endif
Run Code Online (Sandbox Code Playgroud)

macros intellisense visual-studio visual-c++ visual-studio-2013

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

Python可以导入未安装的模块

所以,我正在打包我编写的python脚本,它有一个子模块,我们称之为submodule.文件夹结构如下所示:

cool_script/
  setup.py
  cool_script.py
  submodule/
    __init__.py
    implementation.py
Run Code Online (Sandbox Code Playgroud)

现在,许多经过pip install .pip install -e .电话,我有那里的情况submodule可以在全球范围内导入.无论我的系统在哪里,这都将始终有效:

$ python3
[...]
>>> import submodule
>>> submodule.__file__
'/home/me/fake/path/cool_script/submodule/__init__.py'
Run Code Online (Sandbox Code Playgroud)

但我不知道为什么.

我做的包再次被卸载,并且pip在其索引中找不到子模块.在dist-package中也没有任何东西,我手动删除了cool_script.egg-link仍然坐在那里的东西:

$ ls /usr/local/lib/python3.4/dist-packages | ack cool 
$ ls /usr/local/lib/python3.4/dist-packages | ack submodule
$ 
Run Code Online (Sandbox Code Playgroud)

PYTHONPATH也是空的:

$ echo $PYTHONPATH

$
Run Code Online (Sandbox Code Playgroud)

为什么Python知道它的位置submodule?我该怎么知道?

python pip python-import python-3.x

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

每个参数的可变宏替换是否可能?

我现在读了很多关于可变参数宏的问题,但似乎并没有人回答最简单的问题:

#define IDENTITY(x) x
#define IDENTITY_FOR_ALL(...) ???
Run Code Online (Sandbox Code Playgroud)

有没有办法IDENTITY_FOR_ALL扩展IDENTITY(X)所有参数?任意数量的参数也可能吗?

c++ c-preprocessor variadic-macros c++11

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

类内朋友运营商似乎没有参与重载决议

在编写一个CRTP模板,使类能够为operator+基于模板参数提供重载时,我发现一个类中的友元运算符似乎没有参与重载解析,如果它的参数都不是它定义的类的类型在.

归结为:

enum class FooValueT{
    zero, one, two
};

class Foo{
    FooValueT val_;
public:
    Foo(FooValueT x) : val_(x){};

    Foo& operator+=(Foo other){
        val_ = (FooValueT)((int)val_ + (int)other.val_);
        return *this;
    }

    //overload for Foo+Foo, FooValueT+Foo and Foo+FooValueT
    friend Foo operator+(Foo lhs, Foo rhs){
        Foo ret = lhs;
        return ret += lhs;
    }

    //explicit overload for FooValueT+FooValueT
    friend Foo operator+(FooValueT lhs, FooValueT rhs){
        return (Foo)lhs + (Foo)rhs;
    }
};
Run Code Online (Sandbox Code Playgroud)

看起来有点过分,但是必要,因为它Foo my = FooValueT::one + FooValueT::zero;应该是一个有效的表达式,如果没有任何参数具有class-type,它们就不会被隐式转换,正如我在上一个问题的答案中所解释的那样.

尽管付出了所有这些努力,但以下代码无法编译:

int …
Run Code Online (Sandbox Code Playgroud)

c++ overloading operator-overloading friend

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

我可以为 protobuf 中的数字设置最大值吗?

在protobuf中,我们只能选择使用有符号或无符号的32位或64位整数来限制值的范围。

然而,我想要定义的数据结构包含 8 位、16 位和 32 位整数的混合,以节省嵌入式设备上的空间。在它们上,数据结构的实现也有些不同,并且需要为某些字段保留特殊值,因此它们的最大数量不是 2 的幂。

在这些嵌入式设备上,protobuf 定义仅用于与它们之间的传输,而不用于实际存储。所以我可以在读入它们时限制数字。

但是,我宁愿在.proto.options文件中定义这些最大值,以确保所有客户端应用程序都了解这些限制。

有没有办法做到这一点?

我知道有字段选项,但此处列出的选项不包含此选项。可以创建自定义选项,但这似乎需要编写编译器扩展,这意味着我必须为我想要编译的每种语言手动实现此限制检查,而这会花费比节省的时间更多的时间。

size limit protocol-buffers proto3

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