1

我有一个模板类Converter,我想做一个部分专业化。棘手的部分是我想将它专门化到MyFoo::Vec可以MyFoo再次专门化为模板参数的地方。如果这听起来令人困惑,也许代码本身使它更清晰:

#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);
}

这只是一个源自我的实际代码的迷你示例。这个问题不是关于这种转换器有多有用。鉴于我需要这样的转换器及其专业化,我只是对正确的语法感兴趣。

4

1 回答 1

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 回答