我在 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(),但我想它对我来说没有用。
我试图用值进行模板特化,一个化身是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枚举类的一个原因是避免隐式转换,但不确定.这是编译器错误,还是标准中的一些缺陷?
我需要检查给定的类是否<<(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++编程以来已经有很长一段时间了,如果有人能指导我创建一个Node类,其中一个私有变量是Node类对象的列表(或向量),我将非常感激.
我希望创建一个类结构:
class Node {
private:
string ID;
vector < Node > list;
public:
Node();
void some_Function();
};
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?一个类是否可以将其私有成员之一作为相同类类型的对象列表?
#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 ++ 11中,将'override'说明符添加到派生类中的虚方法中,声明了覆盖基类中的虚函数的意图.
有没有办法在C++ 03中实现类似的效果,假设它只能修改派生类而不是基类?
似乎某些容器接受std::pair<const int, int>为值类型,但有些容器不接受.问题当然在于该const部分.
我做了一些谷歌搜索,发现只std::vector需要可复制的数据.然而,std::pair<const int, int>工作得很好std::vector,std::set和std::list(也许是其他容器),但没有std::map和std::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)
Run Code Online (Sandbox Code Playgroud)error: assignment of read-only member ‘std::pair<const int, int>::first’
这背后的原因是什么?鉴于它们具有相同的底层实现,不应该std::map并且std::set具有相同的行为吗?为什么std::vector它需要移动数据呢?
尝试使用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)
它工作得很好.(当然,调整了所有签名方法).
我不明白导致错误的原因.
我想要一个非常友好的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) 我浏览了大多数有关qsort与C++中sort之间比较的问题.我想问一下,是否有任何情况你更喜欢qsort而不是排序?
c++ ×10
c++11 ×8
c ×1
c++03 ×1
gcc ×1
operators ×1
quicksort ×1
std-function ×1
stdbind ×1
stdtuple ×1
stl ×1
templates ×1
type-traits ×1
vector ×1
visual-c++ ×1