それ自体がテンプレート クラスであるクラスに特殊化を提供しようとしているテンプレートを作成しています。それを使用するとき、私は実際にテンプレート化されたクラスの派生物でそれをインスタンス化しているので、次のようなものがあります:
template<typename T> struct Arg
{
static inline const size_t Size(const T* arg) { return sizeof(T); }
static inline const T* Ptr (const T* arg) { return arg; }
};
template<typename T> struct Arg<Wrap<T> >
{
static inline const size_t Size(const Wrap<T>* arg) { return sizeof(T); }
static inline const T* Ptr (const Wrap<T>* arg) { return arg.Raw(); }
};
class IntArg: public Wrap<int>
{
//some code
}
class FloatArg: public Wrap<float>
{
//some code
}
template<typename T>
void UseArg(T argument)
{
SetValues(Arg<T>::Size(argument), Arg<T>::Ptr(&argument));
}
UseArg(5);
UseArg(IntArg());
UseArg(FloatArg());
いずれの場合も、最初のバージョンが呼び出されます。したがって、基本的に私の質問は次のとおりです。どこで間違ったのか、UseArg(5) を呼び出すときに arg を返すバージョンと、UseArg(intArg) を呼び出すときに別のバージョンを呼び出すにはどうすればよいですか? このようなことを行う他の方法 (UseArg のインターフェイスを変更せずに) はもちろん大歓迎です。
注意として、この例は少し単純化されており、実際のコードではより複雑なものをラップしており、派生クラスにはいくつかの実際の操作があることを意味しています。