我有一个模板化类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);
}
这只是从我的实际代码派生的一个迷你示例。这个问题不是关于这样的转换器有多大用处;我只是对获得正确的语法感兴趣,因为我需要这样的转换器及其专业化。
它不能直接完成。考虑到不可能从嵌套类型转到封闭类型,原因有两个:首先,映射可能不是唯一的(多个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