我知道捕获列表使变量在lambda函数体内可用,如下所示:
int pos(0);
std::function<void()> incPos = [&pos](){ ++pos; };
incPos(); //pos is now 1
Run Code Online (Sandbox Code Playgroud)
但是,捕获实际上如何在编译器级别上工作?捕获的地址或捕获的值存储在哪里?
有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 == B和B == A手动?
使用该关键字delete可以防止编译器自动添加某些构造函数的标准实现.
这个删除是继承到子类吗?
我正在将Web应用程序从普通Javascript迁移到Typescript,并使用--outFile编译器选项和/// <reference path="..."/>指令将所有单独的文件编译为单个文件.
这很好,因为我可以将我的代码分成多个文件,而不必担心浏览器支持import.
我使用的一个库是color-js,它在一个名为的文件中有类型定义color.d.ts.
要使用普通的Javascript,我会执行以下操作:
[...]
<script src="scripts/color-js/color.js"></script>
<script src="main.js"></script>
[...]
Run Code Online (Sandbox Code Playgroud)
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)
有没有办法只使用类型定义 …
当仅使用标准类型参数实例化具有模板化类类型的变量时,语法如下所示:
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.
每个编译器都有一个像__BORLANDC__定义的宏,使程序员能够激活或停用某些行为或变通方法.
在IntelliSense解析文件时是否定义了这样的宏,以便我可以激活bug的变通方法?
#if defined __INTELLISENSE__
#define SOMETHING
#endif
Run Code Online (Sandbox Code Playgroud) macros intellisense visual-studio visual-c++ visual-studio-2013
所以,我正在打包我编写的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?我该怎么知道?
我现在读了很多关于可变参数宏的问题,但似乎并没有人回答最简单的问题:
#define IDENTITY(x) x
#define IDENTITY_FOR_ALL(...) ???
Run Code Online (Sandbox Code Playgroud)
有没有办法IDENTITY_FOR_ALL扩展IDENTITY(X)所有参数?任意数量的参数也可能吗?
在编写一个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) 在protobuf中,我们只能选择使用有符号或无符号的32位或64位整数来限制值的范围。
然而,我想要定义的数据结构包含 8 位、16 位和 32 位整数的混合,以节省嵌入式设备上的空间。在它们上,数据结构的实现也有些不同,并且需要为某些字段保留特殊值,因此它们的最大数量不是 2 的幂。
在这些嵌入式设备上,protobuf 定义仅用于与它们之间的传输,而不用于实际存储。所以我可以在读入它们时限制数字。
但是,我宁愿在.proto或.options文件中定义这些最大值,以确保所有客户端应用程序都了解这些限制。
有没有办法做到这一点?
我知道有字段选项,但此处列出的选项不包含此选项。可以创建自定义选项,但这似乎需要编写编译器扩展,这意味着我必须为我想要编译的每种语言手动实现此限制检查,而这会花费比节省的时间更多的时间。
c++ ×6
c++11 ×5
class ×1
comparison ×1
constructor ×1
friend ×1
import ×1
inheritance ×1
intellisense ×1
javascript ×1
lambda ×1
limit ×1
macros ×1
overloading ×1
pip ×1
proto3 ×1
python ×1
python-3.x ×1
size ×1
templates ×1
tsc ×1
types ×1
typescript ×1
visual-c++ ×1