小编Yak*_*ont的帖子

在 C++11 中从外部终止线程

我在 C++11 代码中运行多个线程,并且线程体是使用 lambda 函数定义的,如下所示。

// make connection to each device in a separate child thread
std::vector<std::thread> workers;
for(int ii = 0; ii < numDev; ii++)
{    
    workers.push_back(std::thread([=]() {  // pass by value

     // thread body

    }));
}

// detach from all threads
std::for_each(workers.begin(), workers.end(), [](std::thread &t) {
    t.detach();
});

// killing one of the threads here?
Run Code Online (Sandbox Code Playgroud)

我与所有子线程分离,但在工人向量中保留每个子线程的引用。如何稍后在代码中杀死其中一个线程?

这里的帖子建议使用std::terminate(),但我想它对我来说没有用。

c++ multithreading c++11

3
推荐指数
1
解决办法
3365
查看次数

使用MSVC编译器中的枚举类"对重载函数进行模糊调用"

我试图用值进行模板特化,一个化身是bool,而另一个是枚举类.我与编译器争夺了一天,但没有设法克服"对重载函数的模糊调用"错误.那段代码很丑陋而且很长,但这是一个简单的测试用例:

#include <iostream>

enum class Foo { Bar };
enum class Waldo { Fred };

template<Foo ARG, typename... _Types>
inline bool DOIT( _Types&&... _Args )
{
    return true;
}

template<Waldo ARG, typename... _Types>
inline bool DOIT( _Types&&... _Args )
{
    return false;
}

int main()
{
    std::cout << DOIT<Foo::Bar>() << std::endl;
    std::cout << DOIT<Waldo::Fred>() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang 3.8和gcc 4.8.3都可以顺利编译,标准设置为c ++ 11,但MSVC不断向我发出C2668错误消息.

AFAIK枚举类的一个原因是避免隐式转换,但不确定.这是编译器错误,还是标准中的一些缺陷?

c++ visual-c++ c++11

3
推荐指数
1
解决办法
127
查看次数

在c ++ 11中检查运算符是否存在的最佳方法

我需要检查给定的类是否<<(cls, ostream)定义了运算符.如果是这样,我希望我的函数使用它来写入ostringstream,否则应该使用样板代码.

我知道之前已经问过这个问题.但是,我通常会发现自定义解决方案并不总是适用于我的编译器(clang ++).经过几个小时的搜索,我终于发现了boost :: type_traits.我之前没有看过那里,因为我假设c ++ 11已经复制了特征部门的所有内容.

对我有用的解决方案是:

template <typename C>
std::string toString(C &instance) {
    std::ostringstream out;
    out << to_string<C, boost::has_left_shift<C, std::ostream>::value>::convert(ctx);
    return out.str();
}
Run Code Online (Sandbox Code Playgroud)

to_string定义为:

template <typename C, bool>
struct to_string {
    // will never get called
    static std::string convert(LuaContext &ctx) {}
};

template <typename C>
struct to_string<C, true> {
    static std::string convert(LuaContext &ctx) {
        return "convert(true) called.";
    }
};

template <typename C>
struct to_string<C, false> {
    static std::string convert(LuaContext &ctx) { …
Run Code Online (Sandbox Code Playgroud)

c++ operators type-traits c++11

2
推荐指数
1
解决办法
1719
查看次数

对于C++中的给定类,是否可以将同一类对象的向量作为私有变量?

自从我做任何C++编程以来已经有很长一段时间了,如果有人能指导我创建一个Node类,其中一个私有变量是Node类对象的列表(或向量),我将非常感激.

我希望创建一个类结构:

class Node {
private:
  string ID;
  vector < Node > list;
public:
  Node();
  void some_Function();
};
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?一个类是否可以将其私有成员之一作为相同类类型的对象列表?

c++ vector

2
推荐指数
1
解决办法
132
查看次数

#pragma一次出现问题

#pragma once在编译我一直在研究的项目时,它无法正常工作.稍微阅读了一下这个主题后,我发现使用它的一个缺点是,如果同一个文件位于不同的位置,那么它将不会像使用包含这样的包含警卫的其他方式一样工作:

#ifndef __SOMETHING_H__ 
#define __SOMETHING_H__ 
Run Code Online (Sandbox Code Playgroud)

这是错误:

../../engine/scene/../common/../bitsquid/queue.h:78:29: error: redefinition of    ‘template<class T> void foundation::queue::reserve(foundation::Queue<T>&, uint32_t)’
../../engine/scene/../common/../bitsquid/queue.h:78:29: error: ‘template<class T> void foundation::queue::reserve(foundation::Queue<T>&, uint32_t)’ previously declared here
Run Code Online (Sandbox Code Playgroud)

您可以看到路径是相同的.我正在使用g ++来编译源代码.我通常会用其他类型的包含警卫替换它,但我想避免这样,因为我没有写库.

gcc版本是4.6.3

c c++ gcc

2
推荐指数
1
解决办法
2120
查看次数

有没有办法在c ++ 03中模拟c ++ 11'override'说明符的效果?

在c ++ 11中,将'override'说明符添加到派生类中的虚方法中,声明了覆盖基类中的虚函数的意图.

有没有办法在C++ 03中实现类似的效果,假设它只能修改派生类而不是基类?

c++ c++11 c++03

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

为什么std :: pair <const int,int>不适用于某些STL容器?

似乎某些容器接受std::pair<const int, int>为值类型,但有些容器不接受.问题当然在于该const部分.

我做了一些谷歌搜索,发现只std::vector需要可复制的数据.然而,std::pair<const int, int>工作得很好std::vector,std::setstd::list(也许是其他容器),但没有std::mapstd::priority_queue(后者真的很烦我).

以下编译没有问题(gcc 6.1.0)

std::vector<std::pair<const int, int>> vector;
vector.push_back(std::make_pair(3, 5));
std::set<std::pair<const int, int>> set;
set.insert(std::make_pair(3, 5));
std::list<std::pair<const int, int>> list;
list.push_back(std::make_pair(3, 5));
Run Code Online (Sandbox Code Playgroud)

但这会导致编译错误:

std::priority_queue<std::pair<const int, int>> pq;
pq.push(std::make_pair(3, 5));
std::map<int, std::pair<const int, int>> map;
map[2] = std::make_pair(3, 5);
Run Code Online (Sandbox Code Playgroud)
error: assignment of read-only member ‘std::pair<const int, int>::first’
Run Code Online (Sandbox Code Playgroud)

这背后的原因是什么?鉴于它们具有相同的底层实现,不应该std::map并且std::set具有相同的行为吗?为什么std::vector它需要移动数据呢?

c++ stl c++11

2
推荐指数
1
解决办法
752
查看次数

绑定std :: function错误

尝试使用std :: function和std :: bind绑定方法时遇到问题.

在我的CommunicationService类中:

this->httpServer->BindGET(std::bind(&CommunicationService::ManageGETRequest, this, std::placeholders::_1));
Run Code Online (Sandbox Code Playgroud)

CommunicationService :: ManageGetRequest签名:

MessageContent CommunicationService::ManageGetRequest(std::string uri, MessageContent msgContent)
Run Code Online (Sandbox Code Playgroud)

BindGET签名:

void RESTServer::BindGET(RequestFunction getMethod)
Run Code Online (Sandbox Code Playgroud)

RequestFunction typedef:

typedef std::function<MessageContent(std::string, MessageContent)> RequestFunction;
Run Code Online (Sandbox Code Playgroud)

BindGET上的错误:

错误C2664:'void RESTServer :: BindGET(RequestFunction)':无法从'std :: _ Binder <std :: _ Unforced,MessageContent(__cdecl communication :: CommunicationService ::*)(std :: string,MessageContent)转换参数1, communication :: CommunicationService*const,const std :: _ Ph <1>&>'to'RequestFunction'

之前,我的RequestFunction是这样的:

typedef std::function<void(std::string)> RequestFunction;
Run Code Online (Sandbox Code Playgroud)

它工作得很好.(当然,调整了所有签名方法).

我不明白导致错误的原因.

c++ stdbind c++11 std-function

2
推荐指数
1
解决办法
2027
查看次数

c ++ 11如何实现`std :: string ToString(std :: tuple <Args ...>&t)`?

我想要一个非常友好的ToString功能,包括许多类型std::tuple.功能是这样的:

template <typename T>
inline std::string ToString(const T &t) { 
    std::stringstream ss;
    ss << t;
    return ss.str();
}

template <typename... Args>
inline std::string ToString(const std::tuple<Args...> &t) {
    std::stringstream ss;
    for (int i = 0; i < t.size(); i++) {
        ss << ToString(std::get<i>(t)) << " ";
    }
    return ss.str();
}
Run Code Online (Sandbox Code Playgroud)

第二部分是语法错误,如何用c ++ 11模板实现它?

而且,如何实现FromString这样的:

template <typename T>
inline T FromString(const std::string &s) {
    std::stringstream ss(s);
    T t;
    ss >> t;
    return t;
}

template <typname... …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11 stdtuple

2
推荐指数
1
解决办法
431
查看次数

我应该在C++中使用qsort而不是sort吗?

我浏览了大多数有关qsort与C++中sort之间比较的问题.我想问一下,是否有任何情况你更喜欢qsort而不是排序?

c++ quicksort c++11

2
推荐指数
1
解决办法
150
查看次数