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

前端之家收集整理的这篇文章主要介绍了c – 模板类的模板功能专业化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
可以在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++相关文章