2

私は、プリミティブ型の引数を持つテンプレートを使用して、ピクセル形式とキャンバス システムに取り組んできました。

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 {};
4

1 に答える 1

3

レイヤーで単一のピクセル タイプを使用する場合は、次のものが必要です。

template < typename PixelType > struct Layer {
   ...
};

using RGBA8Layer = Layer < Pixel<8, RGBA> >;

bit_depthformatからアクセスする必要がある場合は、いずれかまたは別の「特性」テンプレートLayerで static const メンバーを定義します。Pixel

使用しようとしている構成は、「テンプレート テンプレート パラメーター」と呼ばれます。これらは、同じ署名を持つテンプレートが多数ある可能性がある場合に必要です。

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

于 2013-08-29T18:47:02.193 に答える