我不知道这是否可行,但我想更好地了解这是如何运作的。
类可以使用转换操作来匹配模板参数吗? 这就是我想要做的。
#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 *?
答案 0 :(得分:1)
如果你希望指针的模板类的行为类似于其他东西的模板类,那么只需继承:
template<typename T>
struct Value<T*> : Value<ClassContainer<T>> {};
它将继承public printValue
函数,该函数接受可以从T*
构造的参数,并且所有内容都将按预期进行隐式转换。
全部查看here。