试图找到一个更好的设计!
考虑到我们有一个模板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) 我得到了一个简单的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)