c – 模板类的模板功能专业化

c – 模板类的模板功能专业化,第1张

概述可以在C 11/14中写这样的东西吗? #include <iostream>#include <vector>template <typename T>T Get();template <typename T>struct Data { std::vector<T> data;};template <>template <typename T>Data<T> Ge 可以在C 11/14中写这样的东西吗?
#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 – 模板类的模板功能专业化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253888.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存