【发布时间】:2015-04-20 18:10:07
【问题描述】:
是否可以在 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);
}
欢迎任何关于如何克服这个问题的指导。
【问题讨论】:
-
不,我们仍然不能部分专门化函数模板。是的,有一些解决方法。
-
我更新了我的答案以将其应用于您的全新问题。不过,希望不会有任何其他变化。
标签: c++ templates c++11 c++14 template-specialization