当试图回答另一个Stackoverflow问题时,我意识到这个简单的C++ 11片段隐式阻塞了调用线程:
std::async(std::launch::async, run_async_task)
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是规范的C++ 11方式异步启动任务而不关心结果.相反,为了实现这一点,人们必须明确地创建和分离一个线程(参见上述问题的答案).
所以这是我的问题:关于安全性/正确性,是否有任何理由std::future必须阻止析构函数?如果它get仅仅阻止它就不够了,否则,如果我对返回值或异常不感兴趣,它只是火而忘记?
我想知道是否可以编写一个模板函数,可以将任何其他任意模板作为参数并正确匹配模板名称(即不仅仅是结果类).我所知道的工作是:
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
Run Code Online (Sandbox Code Playgroud)
这将匹配例如用于f(std::vector<int>())或f(std::list<int>())但不会对工作f(std::array<int, 3>()),作为第二个参数是一个size_t无类型.
现在我想我可以做一些疯狂的事情:
template<template<typename ...> class TemplateT, size... Sizes, typename... TemplateP>
void f(const TemplateT<Sizes..., TemplateP...>& param);
Run Code Online (Sandbox Code Playgroud)
希望编译器能够正确地将TemplateP省略号或Sizes省略号导出为空.但它不仅难看,它仍然适用于采用任何类型或size_t参数的模板.它仍然不会匹配任意模板,例如bool参数.
对于重载方法也是如此:
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
template<template<typename ...> class TemplateT, size... Sizes>
void f(const TemplateT<Sizes...>& param);
Run Code Online (Sandbox Code Playgroud)
此外,这种方法不会"工作,如果我们想混size_t和typenames.那么匹配任何内容所需要的就是这样的东西,其中对省略号中允许的内容没有任何限制:
template<template<...> class TemplateT, ... Anything>
void f(const TemplateT<Anything...>& param);
Run Code Online (Sandbox Code Playgroud)
该语法不起作用,但也许还有其他语法来定义这样的东西? …
我正在构建一个包含主题的JS脚本,为了运行多个主题,每个类名都有一个前缀 - 这会使类名有点长.
我也有CSS规则取决于是否有元素有更多的类名,以提供特殊效果.
我的问题是,较长的CSS类名会对性能产生影响,还是只会选择错误/错误/低效的选择器会降低性能?
我想知道为什么,尽管在Java中执行以下操作是完全有效的
public enum Test {
VALUE1() {
public static final String CONST_RELATED_TO_VALUE1 = "constant";
public static final String OTHER_CONST_RELATED_TO_VALUE1 = "constant";
},
VALUE2() {
public static final String CONST_RELATED_TO_VALUE2 = "constant";
},
VALUE3;
}
Run Code Online (Sandbox Code Playgroud)
正如人们期望的那样访问常量Test.VALUE1.CONST_RELATED_TO_VALUE1不起作用.
现在我明白了VALUE1,VALUE2等等,实际上都普遍被视为类型的静态终审Test,因此不具备这些领域,但信息理论上应该可以在编译时,它可以很容易地验证运行一个小测试
// print types and static members
for (Object o: Test.values()) {
System.out.println(o.toString() + ": " + o.getClass());
for (Field field : o.getClass().getDeclaredFields()) {
if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
System.out.println("\t" + field);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这导致以下输出
VALUE1: class …Run Code Online (Sandbox Code Playgroud) 我正在使用strtok将字符串拆分为标记.有谁知道实际计算令牌数量的任何功能?
我有一个命令字符串,我需要拆分它并传递参数execve().
谢谢!
编辑
execve将参数作为char**,所以我需要分配一个指针数组.我不知道有多少分配而不知道有多少令牌.
我有以下问题,我只是没有看到一个正确的解决方案(也许没有):我有一个模板化的方法,其中返回类型取决于输入类型,并感谢C++ 11 decltype的返回类型可以很容易地派生,但我还想允许用户在需要时明确定义返回类型.
更正式地说,我有一个模板化的函数f,我希望可以调用它f(x),既没有显式定义输入也没有返回类型.而且我还希望能够像f<ret_t>x()显式定义的返回类型一样调用它,但输入类型仍然自动派生.
现在,用C++ 11满足第一个约束是很容易的(让我们假设还有另一个模板化的方法:
template<typename InT>
auto f(const InT& in) -> decltype(/* code deriving the return type using in */);
Run Code Online (Sandbox Code Playgroud)
但是这不会允许覆盖返回类型,因为我必须将其添加为第二个模板参数并将decltype派生移动到模板定义中,并且可能需要使用std::declval<InT>或std::result_of:
template<
typename InT,
typename RetT = /* code deriving return type using InT and declval/result_of */>
RetT f(const InT& in);
Run Code Online (Sandbox Code Playgroud)
但是,这种方式我总是需要InT在调用时明确定义f.因此f,为了能够保持InT开放但声明的声明RetT应该是:
template<
typename RetT = /* code deriving return type using InT …Run Code Online (Sandbox Code Playgroud) 我想知道将一堆MD5哈希值散列在一起以创建新哈希是否"安全",或者这是否会以任何方式增加冲突的概率.
背景:我有几个依赖的文件.每个文件都有一个关联的哈希值,该哈希值是根据它的内容计算的.我们称之为"单文件"哈希值.除此之外,该文件还应具有包含所有相关文件的哈希值,即"多文件"哈希值.
所以问题是:我可以只取相关文件的所有单文件MD5哈希值,连接它们,然后在连接值上计算MD5以获得多文件哈希值.或者这会导致MD5哈希比我将所有相关文件的内容连接在一起更容易发生冲突.
或者,我可以将单个文件哈希值合并在一起以生成多文件哈希值,或者这可能会导致更多冲突吗?
我想知道对Qt容器内的值的引用有多长,特别是a QHash或a QMap是有效的.有效我的意思是,如果在插入或删除其他元素后仍保证指向map/hash中的正确位置.
让我们以下代码:
QHash<char,int> dict; // or QMap<char,int> dict;
dict.insert('a', 1);
int& val(dict['a']);
dict.insert('b', 2);
val = 3; // < will this work or lead to a segfault
Run Code Online (Sandbox Code Playgroud)
将在最后一行的值设置正确地更新与相关联的值a来3还是会导致段错误还是会是不确定的(所以有时候工作,段错误其他时间,具体取决于数据结构是否必须进行内部重组,像调整散列表数组).是行为同为QMap和QHash,或将一个工作和其他不?
是否有一种简便的方法来获取对本地静态方法的方法引用,就像this调用方法时可以删除关键字或类前缀一样?
显而易见的是使用::myStaticMethod但似乎无法编译:
class MyClass {
static void myStaticMethod () {}
static Runnable runner = ::myStaticMethod; // doesn't compile
// requires MyClass prefix despite being in the same class
}
Run Code Online (Sandbox Code Playgroud) 我们对QIODevice::write一般行为和QTcpSocket具体实施感到困惑.已经有类似的问题,但答案并不令人满意.主要的混淆源于那里提到的bytesWritten信号和waitForBytesWritten方法.这两个似乎表明从QIODevice实际底层设备所使用的缓冲区写入的字节(必须有这样的缓冲区,否则该方法没有多大意义).然而问题是,如果返回的数字QIODevice::write与此数字相对应,或者在这种情况下它指示存储在内部缓冲区中的字节数,而不是写入底层设备的字节数.如果返回的数字表示写入内部缓冲区的字节,我们需要采用如下模式来确保写入所有数据:
void writeAll(QIODevice& device, const QByteArray& data) {
int written = 0;
do {
written = device.write(data.constData() + written, data.size() - written);
} while(written < data.size());
}
Run Code Online (Sandbox Code Playgroud)
但是,如果返回值QIODevice::write与bytesWritten信号的含义相对应,则会插入重复数据.文档对此非常困惑,因为在两种方法中都使用了" 设备"这个词,即使它似乎是逻辑和一般的理解,一个实际上表示写入缓冲区而不是设备.
总而言之,问题是:数字是否返回QIODevice::write写入底层设备的字节数,因此保存到调用QIODevice::write 而不检查返回的字节数,因为所有内容都存储在内部缓冲区中.或者它是否表明它可以在内部存储多少字节,并且writeAll必须采用类似上述的模式来安全地将所有数据写入设备?
(更新:看一下源代码,QTcpSocket::write实现实际上永远不会返回比想要写的更少的字节,所以writeAll不需要上面的内容.但是,这是特定于套接字和这个Qt版本,文档仍然令人困惑...... )