使用隐式转换为它的另一个类的模板特化

时间:2016-11-24 22:43:55

标签: c++ templates template-specialization

我不知道这是否可行,但我想更好地了解这是如何运作的。

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

#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 *?

1 个答案:

答案 0 :(得分:1)

如果你希望指针的模板类的行为类似于其他东西的模板类,那么只需继承:

template<typename T>
struct Value<T*> : Value<ClassContainer<T>> {};

它将继承public printValue函数,该函数接受可以从T*构造的参数,并且所有内容都将按预期进行隐式转换。

全部查看here