c++ - 模板模板函数定义

标签 c++ templates template-argument-deduction template-templates

我有一个名为 Array 的模板类

template<typename T, int dimension>
class Array<typename T, int dimension>{

    //definition of the class

}

我想编写一个非成员函数转换,以便我可以将 Array 转换为不同的类型。例如

Array<int, 2> a;
Array<float, 2> b = cast<float>(a);

这个函数应该怎么写?我更感兴趣的是如何声明它而不是如何实现详细的转换。我试过了

template<template<typename T, int dimension> class Array, typename New_T, int dimension>
Array<typename New_T, int dimension> cast(Array<typename T, int dimension> a){

// detailed implementation of casting, which I do not care for this question.

}

但无法通过编译。

最佳答案

这里根本不需要模板模板参数。简单的 typenameint 参数就可以:

template <typename T, int dimension>
class Array
{
    // ...
};

template <typename NewT, typename T, int dimension>
Array<NewT, dimension> cast(const Array<T, dimension>& a)
{
    // ...
}

Live Demo

只有当你想接受不同类型的模板时,你才需要模板模板参数。例如,如果您希望 cast 能够接受 Arraystd::array,您可以使用模板模板参数:

template<typename NewT, typename T, auto dimension, template<typename, auto> typename ArrayT>
ArrayT<NewT, dimension> cast(const ArrayT<T, dimension>& a)
{
    // ...
}

Live Demo

请注意,在这种情况下,我还将 dimension 的类型更改为 auto,因为 std::array 使用 size_t 用于其维度,而您的 Array 使用 int

关于c++ - 模板模板函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51053555/

相关文章:

html - 用响应式模板中的文本框替换下拉菜单

c++ - 从 std::function 调用签名推断模板参数

c++ - 为什么这个对模板的调用不模棱两可?

c++ - 开始和结束数组索引算法

c++ - SerializeToArray protobuf 不存储

c++ - 检查结构中的指针是否为空

c++ - 是否可以使用 stdio 函数读取 Windows 应用商店应用程序中的资源?

c++ - 在不知道类成员的情况下从基类实例创建派生类实例

visual-studio-2008 - Visual Studio 项目模板

c++ - 使用两个以上的参数推导 std::function