2016-11-24 9 views
0

これが可能かどうかわかりませんが、これがどう機能するかを理解したいと思います。暗黙的に変換する別のクラスを使用するテンプレートの特殊化

クラスは、テンプレートパラメータの一致に変換操作を含めることはできますか? これは私がしたいことです。

#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 *に変換されます。 X *だけを渡すClassContainerを照合することは可能ですか?あなたが何か他のテンプレートクラスのように動作するのポインターのテンプレートクラスを使用する場合は

答えて

1

、単に継承:

template<typename T> 
struct Value<T*> : Value<ClassContainer<T>> {}; 
それは T*から構築することができるパラメータを受け入れ公共 printValue機能を、継承します

期待どおりにすべてが暗黙的に変換されます。

すべて見るライブhereを参照してください。