我一直在使用带有基本类型参数的模板处理像素格式和画布系统,即:
enum class PIXEL_FORMAT : char {
PALETTE,
RGB,
RGBA
};
template<unsigned int bit_depth, PIXEL_FORMAT fmt> struct Pixel {};
//specializations for 8-bit, 16-bit, etc. RGB/RGBA formats
这些都可以正常工作,但是当我尝试创建一个Layer结构时:
template< template<unsigned int depth, PIXEL_FORMAT fmt> class PixelType > struct Layer {
using pixel = PixelType<depth, fmt>;
pixel** pixels;
我得到的错误是:
F:\Personal Projects (Java or Other)\C_C++\Independent\GUI Apps\FreeArt\Canvas.h|7|error: 'depth' was not declared in this scope
F:\Personal Projects (Java or Other)\C_C++\Independent\GUI Apps\FreeArt\Canvas.h|7|error: 'fmt' was not declared in this scope
F:\Personal Projects (Java or Other)\C_C++\Independent\GUI Apps\FreeArt\Canvas.h|7|error: template argument 1 is invalid
F:\Personal Projects (Java or Other)\C_C++\Independent\GUI Apps\FreeArt\Canvas.h|7|error: template argument 2 is invalid
显然,我并不了解使用基本类型作为参数的嵌套模板的工作方式。我已经找到了类似的问题,但似乎无法找到使用原始类型而不是常规模板参数(typename T
等)的任何内容。
我希望这可以用于使用基本类型参数的模板的其他类型,例如可能的
template<template<unsigned int bit_depth, double samp_per_sec> class Sound> struct SoundEffect {};
答案 0 :(得分:3)
如果要在图层中使用单个像素类型,则需要:
template < typename PixelType > struct Layer {
...
};
using RGBA8Layer = Layer < Pixel<8, RGBA> >;
如果您需要从bit_depth
内访问format
和Layer
,请在Pixel
或单独的“特征”模板中定义静态const成员。
您尝试使用的构造称为“模板模板参数”。当您有许多具有相同签名的模板时,需要它们:
template <unsigned int bit_depth, PIXEL_FORMAT fmt> struct Pixel {};
template <unsigned int bit_depth, PIXEL_FORMAT fmt> struct FancyPixel {};
template <unsigned int bit_depth, PIXEL_FORMAT fmt> struct FastPixel {};
template <unsigned int bit_depth, PIXEL_FORMAT fmt> struct PackedPixel {};
并且您希望将Layer
,和中的任何一个用于从图层中选择深度和格式,然后您将使用此:
template< template<unsigned int, PIXEL_FORMAT> class PixelType >
struct Layer {
using MyNormalPixel = PixelType<8, RGB>;
using MyHighDefinitionPixel = PixelType<16, RGBA>;
};
using FancyLayer = Layer<FancyPixel>;
using PackedLayer = Layer<PackedPixel>;
注意PixelType
中的参数名称是如何被省略的 - 它们根本不能在代码中使用。他们唯一有用的是文档。这种情况类似于函数参数:
// signature off the top of my head
double integrate (double func(double),
double from, double to, double epsilon, double step);
实际上,模板本质上是类型域中的函数,“模板模板参数”类似于“函数函数参数”,如上面的func
。