模板专业化使用另一个将其隐式转换为其的类

Template specialization using another class that implicit-converts to it

本文关键字:转换 专业化 另一个      更新时间:2023-10-16

我不知道这是否可能,但是我想更好地理解它的工作原理。

可以使用类暗示转换操作来匹配模板参数?这就是我想做的。

#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*构建的参数,并且所有内容都将按预期进行隐式转换。

看到这一切都活在这里。