小编Jan*_*net的帖子

为什么未来的析构函数从`std :: async`阻塞返回?

当试图回答另一个Stackoverflow问题时,我意识到这个简单的C++ 11片段隐式阻塞了调用线程:

std::async(std::launch::async, run_async_task)
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是规范的C++ 11方式异步启动任务而不关心结果.相反,为了实现这一点,人们必须明确地创建和分离一个线程(参见上述问题的答案).

所以这是我的问题:关于安全性/正确性,是否有任何理由std::future必须阻止析构函数?如果它get仅仅阻止它就不够了,否则,如果我对返回值或异常不感兴趣,它只是火而忘记?

c++ multithreading asynchronous std c++11

41
推荐指数
1
解决办法
7726
查看次数

与任何类型的参数匹配的C++可变参数模板模板参数

我想知道是否可以编写一个模板函数,可以将任何其他任意模板作为参数并正确匹配模板名称(即不仅仅是结果类).我所知道的工作是:

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_ttypenames.那么匹配任何内容所需要的就是这样的东西,其中对省略号中允许的内容没有任何限制:

template<template<...> class TemplateT, ... Anything>
void f(const TemplateT<Anything...>& param);
Run Code Online (Sandbox Code Playgroud)

该语法不起作用,但也许还有其他语法来定义这样的东西? …

c++ templates template-templates variadic-templates c++11

40
推荐指数
1
解决办法
2591
查看次数

长的CSS类名会对性能产生影响吗?

我正在构建一个包含主题的JS脚本,为了运行多个主题,每个类名都有一个前缀 - 这会使类名有点长.

我也有CSS规则取决于是否有元素有更多的类名,以提供特殊效果.

我的问题是,较长的CSS类名会对性能产生影响,还是只会选择错误/错误/低效的选择器会降低性能?

css performance

15
推荐指数
1
解决办法
3124
查看次数

为什么我不能从Java中的专用枚举值访问静态最终成员

我想知道为什么,尽管在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)

java compiler-construction enums types

15
推荐指数
2
解决办法
820
查看次数

有没有办法计算C中的令牌?

我正在使用strtok将字符串拆分为标记.有谁知道实际计算令牌数量的任何功能?

我有一个命令字符串,我需要拆分它并传递参数execve().

谢谢!

编辑

execve将参数作为char**,所以我需要分配一个指针数组.我不知道有多少分配而不知道有多少令牌.

c token delimiter strtok

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

C++函数模板:派生和显式返回类型

我有以下问题,我只是没有看到一个正确的解决方案(也许没有):我有一个模板化的方法,其中返回类型取决于输入类型,并感谢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)

c++ templates c++11

10
推荐指数
1
解决办法
806
查看次数

递归MD5和碰撞概率

我想知道将一堆MD5哈希值散列在一起以创建新哈希是否"安全",或者这是否会以任何方式增加冲突的概率.

背景:我有几个依赖的文件.每个文件都有一个关联的哈希值,该哈希值是根据它的内容计算的.我们称之为"单文件"哈希值.除此之外,该文件还应具有包含所有相关文件的哈希值,即"多文件"哈希值.

所以问题是:我可以只取相关文件的所有单文件MD5哈希值,连接它们,然后在连接值上计算MD5以获得多文件哈希值.或者这会导致MD5哈希比我将所有相关文件的内容连接在一起更容易发生冲突.

或者,我可以将单个文件哈希值合并在一起以生成多文件哈希值,或者这可能会导致更多冲突吗?

md5 hash-collision

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

QMap/QHash operator []返回引用有效性

我想知道对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)

将在最后一行的值设置正确地更新与相关联的值a3还是会导致段错误还是会是不确定的(所以有时候工作,段错误其他时间,具体取决于数据结构是否必须进行内部重组,像调整散列表数组).是行为同为QMapQHash,或将一个工作和其他不?

c++ qt dictionary qmap

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

Java本地静态方法参考简写语法

是否有一种简便的方法来获取对本地静态方法的方法引用,就像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)

java syntax method-reference

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

Qt QIODevice :: write/QTcpSocket ::写入和写入的字节

我们对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::writebytesWritten信号的含义相对应,则会插入重复数据.文档对此非常困惑,因为在两种方法中都使用了" 设备"这个词,即使它似乎是逻辑和一般的理解,一个实际上表示写入缓冲区而不是设备.

总而言之,问题是:数字是否返回QIODevice::write写入底层设备的字节数,因此保存到调用QIODevice::write 而不检查返回的字节数,因为所有内容都存储在内部缓冲区中.或者它是否表明它可以在内部存储多少字节,并且writeAll必须采用类似上述的模式来安全地将所有数据写入设备?

(更新:看一下源代码,QTcpSocket::write实现实际上永远不会返回比想要写的更少的字节,所以writeAll不需要上面的内容.但是,这是特定于套接字和这个Qt版本,文档仍然令人困惑...... )

c++ sockets qt

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