我有一个模板化函数定义为:
template<typename TObject> TObject Deserialize(long version, const Value &value)
我需要做的是编写一个特化,它将 vector 定义为:
template<typename TNum, int cnt> class Vec
并且仍然可以访问 cnt 和 TNum。
我试过没成功
template<typename TNum, int cnt> Vec<TNum, cnt> Deserialize<Vec<TNum, cnt>>(long version, Value &value)
导致错误:非法使用显式模板参数
正确的做法是什么?
最佳答案
通常,处理函数模板并需要部分特化它们的正确答案是简单地重载它们。在这种情况下,这个技巧不会直接起作用,因为没有依赖于模板参数的参数,即模板参数是明确指定的,而不是推导出来的。但是,您可以转发到实现函数,并使用简单的标记结构进行重载。
#include <functional>
#include <iostream>
#include <type_traits>
#include <vector>
#include <array>
template <class T>
struct tag{};
template<typename TObject>
TObject Deserialize_impl(long version, tag<TObject>) {
std::cerr << "generic\n";
return {};
}
template<typename T, std::size_t N>
std::array<T,N> Deserialize_impl(long version, tag<std::array<T,N>>) {
std::cerr << "special\n";
return {};
}
template<typename TObject>
TObject Deserialize(long version) {
return Deserialize_impl(version, tag<TObject>{});
}
int main() {
Deserialize<int>(0);
Deserialize<std::array<int,3>>(0);
return 0;
}
实例:http://coliru.stacked-crooked.com/a/9c4fa84d2686997a
我通常发现这些方法比使用静态方法(这里的另一种主要方法)对结构进行部分特化更可取,因为函数可以利用很多东西,而且与特化相比,它的行为更直观。 YMMV.
关于c++ - 嵌套模板特化是如何完成的 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45927017/