gpt4 book ai didi

c++ - 特定模板类型的功能特化

转载 作者:行者123 更新时间:2023-11-30 00:45:48 24 4
gpt4 key购买 nike

考虑以下几点:

template <typename TResult> inline TResult _from_string(const string& str);
template <> inline unsigned long long _from_string<unsigned long long>(const string& str) {
return stoull(str);
}

我可以这样调用函数:

auto x = _from_string<unsigned long long>("12345");

现在我想为 vector 编写另一个特化,即:

template <typename T> inline vector<T> _from_string<vector<T>>(const string& str) {
// stuff that should be done only if the template parameter if a vector of something
}

这样我就可以做这样的事情:

 auto x = _from_string<vector<int>>("{1,2,3,4,5}");

但是,当我编译该函数时(在 MSVC 2015 下),我收​​到错误 C2768:“非法使用显式模板参数”,这是有道理的,因为我不应该在特化中使用新的模板参数。

我如何重写 vector 特化以使其正常工作?

最佳答案

函数模板只能是full specialized , 他们不可能是 partial specialized ;但类模板可以。

// primary class template
template <typename T>
struct X {
static T _from_string(const string& str);
};

// full specialization for unsigned long long
template <>
struct X<unsigned long long> {
static unsigned long long _from_string(const string& str) {
return stoull(str);
}
};

// partial specialization for vector<T>
template <typename T>
struct X<vector<T>> {
static vector<T> _from_string(const string& str) {
// stuff that should be done only if the template parameter if a vector of something
}
};

// helper function template
template <typename TResult>
inline TResult _from_string(const string& str) {
return X<TResult>::_from_string(str);
}

然后

auto x1 = _from_string<unsigned long long>("12345");
auto x2 = _from_string<vector<int>>("{1,2,3,4,5}");

LIVE

关于c++ - 特定模板类型的功能特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41647707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com