1

I have a templated class Converter, and I'd like to do a partial specialization. The tricky part is I'd like to specialize it to MyFoo::Vec where MyFoo again can be specialized as a template parameter. If that sounds confusing, maybe the code itself makes it clearer:

#include <iostream>
#include <vector>

template<class To>
struct Converter {
  Converter(int from, To& to) {
    to = To(from);
  }
};

template<class T>
struct Foo {
  typedef std::vector<T> Vec;
  Vec vec;
};

// Template specialization: Convert from 'From' to 'MyFoo::Vec':                                                                
template<class MyFoo>
struct Converter<typename MyFoo::Vec > { // Error: template parameters not
                                         // used in partial specialization
  Converter(int from, typename MyFoo::Vec& to) {
    to.push_back(typename MyFoo::Vec::value_type(from));
  }
};

int main() {
  Foo<float> myfoo;
  Converter<Foo<float> > converter(2, myfoo.vec);
}

This is just a mini example derived from my actual code. This question is not about how useful such a converter is; I'm just interested in getting the syntax right given that I need such a converter and its specialization.

4

1 に答える 1

2

直接行うことはできません。ネストされた型から外側の型に移行することは、次の 2 つの理由から不可能であると考えてください。まず、マッピングが一意ではない可能性があり (複数Fooが同じネストされたVec型を持つ可能性があります)、たとえそれがあったとしても、コンパイラは既存のすべての型をテストする必要があります。 (つまり、インスタンス化から推測することはできません)。

あなたがしたいことは、実際には SFINAE で行うことができます (テストされていないコード、詳細はこちらで読むことができます):

template <typename T, typename V = void>
struct Converter {};             // Default implementation

template <typename T>
struct Converter<T, T::Vec> {};  // specific if has nested Vec
于 2012-06-28T00:16:42.280 に答える