如何对嵌套类型执行部分模板专用化

How to do a partial template specialization on a nested type?

本文关键字:专用 执行部 嵌套类型      更新时间:2023-10-16

我有一个模板化类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