模板专业化使用另一个将其隐式转换为其的类
Template specialization using another class that implicit-converts to it
我不知道这是否可能,但是我想更好地理解它的工作原理。
可以使用类暗示转换操作来匹配模板参数?这就是我想做的。
#include <iostream>
template<typename T>
struct Value {
};
template<>
struct Value<int> {
static void printValue(int v) {
std::cout << v << std::endl;
}
};
struct Class1 {
int value;
};
/*
template<>
struct Value<Class1*> {
static void printValue(Class1* v) {
std::cout << v->value << std::endl;
}
};
*/
template<typename X>
struct ClassContainer {
ClassContainer(X *c) : _c(c) {}
operator X*() { return _c; }
X *_c;
};
template<typename X>
struct Value<ClassContainer<X>> {
static void printValue(ClassContainer<X> v) {
std::cout << static_cast<X*>(v)->value << std::endl;
}
};
template<typename X>
void doPrintValue(X v)
{
Value<X>::printValue(v);
}
int main(int argc, char *argv[])
{
doPrintValue(10);
Class1 *c = new Class1{ 20 };
//doPrintValue(c); // error C2039: 'printValue': is not a member of 'Value<X>'
ClassContainer<Class1> cc(c);
doPrintValue(cc);
std::cout << "PRESS ANY KEY TO CONTINUE";
std::cin.ignore();
}
ClassContainer隐含转换为X*。是否可以匹配classContainer仅通过x*?
如果您想要指针的模板类,就像其他事物的模板类一样,只需继承:
template<typename T>
struct Value<T*> : Value<ClassContainer<T>> {};
它将继承公共printValue
函数,该函数接受可以从T*
构建的参数,并且所有内容都将按预期进行隐式转换。
看到这一切都活在这里。
相关文章:
- 防止主数据类型C++的隐式转换
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 模板化建造师专业化
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- std::转换move构造函数的模板专业化的变体
- 模板专业化使用另一个将其隐式转换为其的类
- 将模板化类转换为更一般的专业化
- 在基元类型模板专业化之间转换