对于Foo类,有没有办法在不给它命名的情况下禁止构造它?
例如:
Foo("hi");
Run Code Online (Sandbox Code Playgroud)
如果你给它一个名字,只允许它,如下所示?
Foo my_foo("hi");
Run Code Online (Sandbox Code Playgroud)
第一个的生命周期只是语句,第二个是封闭块.在我的用例中,Foo是测量构造函数和析构函数之间的时间.因为我从不参考局部变量,所以我常常忘记将其放入,并且意外地改变了生命周期.我想改为编译错误.
我有一个函数,它接受一个数字并返回那么多东西(比方说,整数).什么是最干净的界面?一些想法:
vector<int>.矢量将被复制多次,这是低效的.vector<int>*.我的getter现在必须分配向量本身以及元素.有谁必须释放向量的所有常见问题,你不能分配一次并使用相同的存储器来进行对getter的许多不同调用等.这就是为什么STL算法通常避免分配内存,而是想要它传入了.unique_ptr<vector<int>>.现在很清楚是谁删除了它,但我们还有其他问题.vector<int>作为参考参数.getter可以push_back()和调用者决定是否到reserve()空间.但是,如果传入vector非空,那么getter应该怎么做?附加?通过先清除它来覆盖?断言它是空的?如果函数的签名只允许一个解释,那将是很好的.begin和end迭代器.现在我们需要返回实际写入的项目数(可能小于预期),并且调用者需要注意不要访问从未写入的项目.iterator,呼叫者可以通过insert_iterator.char *.:)有没有办法简化以下代码?
filenames是文件名(字符串)的列表,例如["foo.txt","bar.c","baz.yaml"]
filenames.map { |f| File.size(f) }
Run Code Online (Sandbox Code Playgroud)
有没有办法将"File.size"变成proc或block?对于现有对象的方法,我可以做到&:method.模块级方法有类似的东西吗?
在bash中,我想说"如果文件不包含XYZ,那么"做一堆事情.将其转换为代码的最自然方式是:
if [ ! grep --quiet XYZ "$MyFile" ] ; then
... do things ...
fi
Run Code Online (Sandbox Code Playgroud)
但是,当然,这不是有效的Bash语法.我可以使用反引号,但之后我将测试文件的输出.我能想到的两个选择是:
grep --quiet XYZ "$MyFile"
if [ $? -ne 0 ]; then
... do things ...
fi
Run Code Online (Sandbox Code Playgroud)
和
grep --quiet XYZ "$MyFile" ||
( ... do things ...
)
Run Code Online (Sandbox Code Playgroud)
我更喜欢第二个,它更像是Lispy和|| 控制流程在脚本语言中并不常见.我也可以看到第一个的参数,虽然当人们读到第一行时,他们不知道你为什么要执行grep,看起来你正在执行它的主要效果,而不仅仅是控制一个脚本分支.
是否有第三种更直接的方式使用一种if陈述并具有grep条件?
在bash提示符下,我可以输入Ctrl-r和Ctrl-s来执行命令历史记录的增量搜索.但是,搜索区分大小写:如果我有一个命令"cat SomeFile.txt",并且我点击"Ctrl-r somefile",我什么也得不到.
有没有办法让搜索不区分大小写?
在Scala中,如何定义一个带有可变数量参数的匿名函数?
scala> def foo = (blah:Int*) => 3
<console>:1: error: ')' expected but identifier found.
def foo = (blah:Int*) => 3
^
Run Code Online (Sandbox Code Playgroud) 为了克服对齐问题,我需要记忆成一个临时的.临时的那种类型是什么?gcc抱怨以下reinterpret_cast将破坏严格的别名规则:
template <typename T>
T deserialize(char *ptr) {
static_assert(std::is_trivially_copyable<T>::value, "must be trivially copyable");
alignas(T) char raw[sizeof(T)];
memcpy(raw, ptr, sizeof(T));
return *reinterpret_cast<T *>(raw);
}
Run Code Online (Sandbox Code Playgroud)
(例如,当T为"长"时).
我不想定义T,因为我不想在覆盖之前构造T.
在一个联合中,不写一个成员然后读另一个计数作为未定义的行为?
template<typename T>
T deserialize(char *ptr) {
union {
char arr[sizeof(T)];
T obj;
} u;
memcpy(u.arr, ptr, sizeof(T)); // Write to u.arr
return u.obj; // Read from u.obj, even though arr is the active member.
}
Run Code Online (Sandbox Code Playgroud) 这段代码:
class Foo {
std::unordered_map<std::string, Foo> x;
};
Run Code Online (Sandbox Code Playgroud)
给我一个错误:
/usr/include/c++/4.7/bits/stl_pair.h:94:11:
error: 'std::pair<_T1, _T2>::second' has incomplete type
foo.cpp:4:7: error: forward declaration of 'class Foo'
Run Code Online (Sandbox Code Playgroud)
但是,这段代码编译得很好:
class Foo {
std::vector<Foo> x;
};
Run Code Online (Sandbox Code Playgroud)
这是库/编译器错误吗?
在优秀博客文章"每个程序员应该知道的未定义行为"中,"违规类型规则"部分说:
将int*转换为float*并取消引用它(访问"int"就好像它是"float")是未定义的行为.C要求通过memcpy进行这些类型的转换:使用指针强制转换不正确并导致未定义的行为.对此的规则是非常细微的,我不想在这里详细说明(char*有例外,向量有特殊属性,工会改变事物等).
我想了解他们完全细微差别的规则.他们在C++ 11规范中的位置是什么?或者失败了,C规格(C90,C99,C11)?
在这个Stack Overflow问题 N3485中链接的C++ 11规范中,我正在查看5.2.10"Reinterpret cast",但是没有看到char*或union的异常语言.所以这可能不是正确的地方.那么正确的地方在哪里?
如何在以下示例中获取成员函数的返回类型?
template <typename Getter>
class MyClass {
typedef decltype(mygetter.get()) gotten_t;
...
};
Run Code Online (Sandbox Code Playgroud)
当然,问题在于我在定义MyClass时没有"mygetter"对象.
我要做的是:我正在创建一个缓存,它可以使用getter返回的内容作为密钥.