小编xer*_*ion的帖子

处理模板创建的更好方法是什么?

试图找到一个更好的设计!

考虑到我们有一个模板Image类,它继承自模板矩阵库(在本例中是Eigen,但它可以是任何东西)

template <typename T>
class Image : public Eigen::Matrix <T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>
Run Code Online (Sandbox Code Playgroud)

现在想想我们想要编写一个函数来处理从文件中读取图像的情况.当然,图像可以是不同类型的,即unisnged char,uint16_t,float,甚至具有不同的通道,如灰度,RGB或甚至RGBA.

所以我们当然可以使用模板类来轻松处理这个问题

Image<RGB<unisgned char>> or Image<RGBA<float>>
Run Code Online (Sandbox Code Playgroud)

当人们知道图像的类型时,它很简单,比如单色8bit

Image<unisgned char> image = ReadImage(const char* const filename);
Run Code Online (Sandbox Code Playgroud)

或者它甚至可以

Image<unisgned char> image;
bool b = ReadImage(const char* const filename, Image<unisgned char>& image)
Run Code Online (Sandbox Code Playgroud)

然而,当读取图像文件时,我们在读取图像之前从不知道类型.例如,Tiff和png都支持8位和16位,tiff甚至支持浮点数.在这种情况下,不可能使用上述任何功能.但是,我们可以使用temmplate Factory类对其进行排序.

为此我们首先需要引入一个BaseImage类

class BaseImage
{
public:
    inline BaseImage() {};
    virtual inline ~BaseImage() {};

    virtual inline int Width() const = 0;
    virtual inline int Height() const = 0;
    virtual inline int Depth() const = 0;
    etc... …
Run Code Online (Sandbox Code Playgroud)

c++ templates design-patterns c++11

6
推荐指数
1
解决办法
294
查看次数

根据模板参数启用Template Ctor

我得到了一个简单的CRTP模板类,我一直在玩这个类,我找到了一个点,我需要有相同的ctor,但在构造函数初始化列表中基本上做了不同的事情.

我确实有一个替代解决方案,但我想知道我想做什么是以更好的方式实现的.

该类的精简版粘贴在下面.您可以忽略Eigen的东西,它只是一个矩阵库.

template<class ImplT, size_t N, bool SquareMatrix = false>
class Foo
{
  template<bool Test, typename Then, typename Else>
  using conditional_t = typename std::conditional<Test, Then, Else>::type;

  // this is defined at compile time so no need to init it
  using VecN = Eigen::Matrix<double, N, 1>;

  // this is a dynamic matrix so dimensions need to be specified at runtime
  using MatN = Eigen::MatrixXd;
  using MatrixType = conditional_t<SquarePreCovariance, MatN, VecN>;

  inline ImplT& impl() noexcept             { return static_cast<ImplT&>(*this); }
  inline const …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

2
推荐指数
2
解决办法
193
查看次数

标签 统计

c++ ×2

c++11 ×2

templates ×2

design-patterns ×1