#include <iostream>#include <vector>template <typename T>T Get();template <typename T>struct Data { std::vector<T> data;};template <>template <typename T>Data<T> Get<Data<T>>() { return Data<T>{{T{},T{}}};}template <>template <typename T>std::vector<T> Get<std::vector<T>>() { return std::vector<T>(3);}int main() { std::cout << Get<Data<int>>().data.size() << std::endl; // expected output is 2 std::cout << Get<std::vector<int>>().size() << std::endl; // expected output is 3 return 0;}
在这种情况下,重载不会有帮助,因为Get< ...>())的调用将变得模糊(see):
template <typename T>Data<T> Get() { return Data<T>{{T{},T{}}};}template <typename T>std::vector<T> Get() { return std::vector<T>(3);}
欢迎任何有关如何克服这个问题的方向.
解决方法 正如Columbo在他的评论中所提到的那样,您应该采用标准的解决方法,因为缺少对功能的部分专业化支持:委派给部分专业的类:template <typename T>struct GetImpl;template <typename T>T Get() { return GetImpl<T>::Do(); }
并且现在在struct GetImpl< T>上使用部分专业化{static T Do(); }而不是Get< T>()
总结以上是内存溢出为你收集整理的c – 模板类的模板功能专业化全部内容,希望文章能够帮你解决c – 模板类的模板功能专业化所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)