正在初始化同时具有字符串和int(like)类型的模板类的静态成员
Initializing static member of a template class with both string and int(like) types
我正在尝试实现一个监视器类来处理多线程。我必须使用Visual Studio 2010,所以我没有c++11。我可以简单地通过创建全局变量来实现这一点,每个全局变量对应我在线程间读/写的每种类型的值,并为每个值使用互斥锁,这很简单,但更乏味。
所以我想慢慢来,在课堂上实现监视器的概念。在某种程度上,这项工作已经"完成"了,因为数据类型是float或int,但我想更进一步,实现monitor类,以支持C标准类型和C++类,例如字符串。
我的方法是让静态成员在线程之间作为共享内存工作,这样我唯一需要做的就是在两个线程中实例化类,然后我就可以正确地设置IPC了。
问题是…我必须初始化静态成员,但我无法使其工作,因为字符串和int类型(int、float等(的初始化方式不同。
这是我尝试做的:
template<class T>
class Monitor : protected Mutex {
public:
Monitor(bool Verbose);
~Monitor();
T read(DWORD wait_time=INFINITE);
void write(T value, DWORD wait_time=INFINITE);
//friend void operator= (Monitor& m1, Monitor& m2);
private:
static T container;
};
template<class T>
T Monitor<T>::container = (typeid(T) == typeid(string) ? "" : 0);
如果我只声明了CCD_ 1或CCD_。宣布两者都让我陷入error C2440: 'initializing' : cannot convert from 'const char *' to 'int'
。
此外,在类中实现这种进程间通信概念的最佳方法是什么?
到目前为止的完整代码:
monitor.cpp:
#include "monitor.h"
using namespace std;
HANDLE Mutex::hMutex = nullptr;
unsigned int Mutex::counter = 0;
Mutex::Mutex(bool V) {
Verbose = V;
if(hMutex == nullptr) {
if(Verbose) cout << "Creating mutexn";
hMutex = CreateMutex(
NULL,
FALSE,
(LPCWSTR) "CONTMUTEX");
counter++;
}
else{
if(Verbose) cout <<"Mutex already createdn";
counter++;
}
}
Mutex::~Mutex() {
counter--;
if(counter == 0) {
if(Verbose) cout << "Destroying mutexn";
CloseHandle(hMutex);
}
else {
if(Verbose) cout << "Awaiting closure of all instances of Mutexn";
}
}
/*void operator= (Monitor& m1, Monitor& m2) {
m1.write(m2.read());
}*/
monitor.h:
#ifndef MONITOR_INC
#define MONITOR_INC
//#include <vector>
#include <Windows.h>
#include <iostream>
using namespace std;
enum verb{VERB_OFF, VERB_ON};
class Mutex {
public:
Mutex(bool Verbose);
~Mutex();
protected:
bool Verbose;
static HANDLE hMutex;
static unsigned int counter;
};
template<class T>
class Monitor : protected Mutex {
public:
Monitor(bool Verbose);
~Monitor();
T read(DWORD wait_time=INFINITE);
void write(T value, DWORD wait_time=INFINITE);
//friend void operator= (Monitor& m1, Monitor& m2);
private:
static T container;
};
template<class T>
T Monitor<T>::container = (typeid(T) == typeid(string) ? "" : 0);
template<class T>
Monitor<T>::Monitor(bool Verbose) : Mutex(Verbose) {
if(Verbose) cout << "Monitor Constructorn";
}
template<class T>
Monitor<T>::~Monitor() {
if(Verbose) cout << "Monitor Destructorn";
}
template<class T>
T Monitor<T>::read(DWORD wait_time) {
T ret_val;
WaitForSingleObject(hMutex, wait_time);
ret_val = container;
ReleaseMutex(hMutex);
return ret_val;
}
template<class T>
void Monitor<T>::write(T value, DWORD wait_time) {
WaitForSingleObject(hMutex, wait_time);
container = value;
ReleaseMutex(hMutex);
}
//void operator= (Monitor& m1, Monitor& m2);
#endif
main.cpp用于测试:
#include "monitor.h"
#include <string>
#include <sstream>
int main() {
Mutex pMutex1(VERB_ON);
Mutex pMutex2(VERB_ON);
Mutex pMutex3(VERB_ON);
Monitor<int> pMonitor1(VERB_ON);
cout << pMonitor1.read() << "n";
pMonitor1.write(20);
cout << pMonitor1.read() << "n";
Monitor<string> pMonitor2(VERB_ON);
cout << pMonitor2.read() << "n";
pMonitor2.write("TURN DOWN FOR WHAT");
cout << pMonitor2.read() << "n";
return 0;
}
我必须为任何不好的做法事先道歉。自从我上一次用C++编码以来,已经有8个月了,我正借此机会为我的C++编码技能擦去一些灰尘。
编辑1
由于某种原因,T Monitor<T>::container = ( (typeid(T) == typeid(string)) ? "" : 0);
实际上不适用于int,只适用于string。
您可以使用专业化:
template<class T> // general case
T Monitor<T>::container = 0;
template<>
std::string Monitor<std::string>::container = "";
或者当您使用默认值时
template<class T>
T Monitor<T>::container = T();
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 如何以"union-like"方式更改C++向量的数据类型
- 如何根据"function like"参数推导函数模板的返回类型?
- 正在初始化同时具有字符串和int(like)类型的模板类的静态成员