c++ - 嵌套模板特化是如何完成的 C++

标签 c++ templates

我有一个模板化函数定义为:

template<typename TObject> TObject Deserialize(long version, const Value &value)

我需要做的是编写一个特化,它将 vector 定义为:

template<typename TNum, int cnt> class Vec

并且仍然可以访问 cntTNum

我试过没成功

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/

相关文章:

javascript - 实现加载 AngularJS 模板的自定义方式

c++ - 一般获取指向多维 C++ 数组第一个元素的指针

php - 测试 Twig 中的变量相等性

c++ - 用于信号处理程序和多线程的 volatile

c++ - Qt5 与 CMake : how to find qt translations dir?

c++ - 为什么使用 thread_local 会崩溃?

C++11模板解析错误,使用模板别名进行类型推导

c++ - 模板类型之间的隐式转换

c++ - 如何使用指针从不同的函数访问局部变量?

c++ - ranges-v3 中的洗牌 Action