0

我有一个简单的图像结构,其中包含实际图像数据。它可以按不同的顺序存储。这是使用的结构的简化:

template <typename T, size_t C>
struct Image
{
public:


private:
    enum class ColorOrder1
    {
        UNKNOWN,
        INTENSITY
    };
    enum class ColorOrder3
    {
        UNKNOWN,
        RGB,
        BGR
    };

    enum class ColorOrder4
    {
        UNKNOWN,
        RGBA,
        BGRA
    };

public:
    using ColorOrder =
        typename std::conditional<C == 4, ColorOrder4,
                                  std::conditional<C == 3, ColorOrder3, ColorOrder1>>::type;

    // ColorOrder colorOrder;                      // <---- This works fine
    ColorOrder colorOrder = ColorOrder::UNKNOWN;   // <---- This does not

    std::shared_ptr<const std::vector<T>> data;

    /* .. and more data. but not imported */
};

我试图根据 std::conditional 的通道数限制可能的颜色顺序。例如,如果我们只有一个单通道图像,则顺序不应该是 RGBA。这基本上有效。但是,如果我尝试将UNKNOWN所有情况的颜色顺序默认为默认值,它将不再编译。虽然UNKNOWN存在于所有枚举中。我得到的结果错误是:


 error: ‘UNKNOWN’ is not a member of ‘Image<unsigned char, 3>::ColorOrder’ {aka ‘std::conditional<true, Image<unsigned char, 3>::ColorOrder3, Image<unsigned char, 3>::ColorOrder1>’}
     ColorOrder colorOrder = ColorOrder::UNKNOWN;

我确实认为我的嵌套std::conditional实际上是失败的。如何正确写这个?

提前感谢您的任何反馈。

4

3 回答 3

3

你错过了一个::type内在的std::conditional

using ColorOrder =
        typename std::conditional<C == 4,
                                  ColorOrder4,
                                  typename std::conditional<C == 3,
                                                            ColorOrder3,
                                                            ColorOrder1
                                                           >::type
                                  >::type;

或者在 C++14 中,

using ColorOrder =
        std::conditional_t<C == 4,
                           ColorOrder4,
                           std::conditional_t<C == 3, ColorOrder3, ColorOrder1>>;
于 2020-03-25T15:10:05.613 回答
2

我会以不同的方式做到这一点:

public:
    using PossibleOrders = std::tuple<void, ColorOrder1, void, ColorOrder3, ColorOrder4>;
    using ColorOrder = typename std::tuple_element<C, PossibleOrders>::type;

    ColorOrder colorOrder = ColorOrder::UNKNOWN;

现场演示

IMO 这种方法更灵活,更容易阅读。

BTW 的使用std::shared_ptr<const std::vector<T>>有点奇怪。可能您想在图像之间共享数据。

于 2020-03-25T15:19:37.553 回答
1

..啊,伙计,在问完这个问题后,我很快就发现出了什么问题:

    using ColorOrder = typename std::conditional<
        C == 4, ColorOrder4,
        typename std::conditional<C == 3, ColorOrder3, ColorOrder1>::type>::type;

请注意我之前错过的其他内容typename::type

于 2020-03-25T15:10:40.083 回答