c ++:是否有类似"boost/std typetraits conditional"的东西在编译时生成一个值(不是一个类型)?

mok*_*oka 3 c++ boost metaprogramming std type-traits

我目前正在执行以下操作以在编译时生成一个值,该函数有效:

        //if B is true, m_value = TRUEVAL, else FALSEVAL, T is the value type
        template<bool B, class T, T TRUEVAL, T FALSEVAL>
        struct ConditionalValue
        {
            typedef T Type;

            Type m_value;

            ConditionalValue():
            m_value(TRUEVAL)
            {}
        };

        template<class T, T TRUEVAL, T FALSEVAL>
        struct ConditionalValue<false, T, TRUEVAL, FALSEVAL>
        {
            typedef T Type;

            Type m_value;

            ConditionalValue():
            m_value(FALSEVAL)
            {}
        };
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地做这样的事情:

template<class T>
void loadPixels(uint32 _w, uint32 _h, T * _pixels)
{
    PixelDataType::Type pixelType = PixelDataType::Auto; //enum I want to set

    ConditionalValue<boost::is_same<T, uint8>::value, PixelDataType::Type, PixelDataType::UInt8, PixelDataType::Auto> checker;
    pixelType = checker.m_value;

   ConditionalValue<boost::is_same<T, uint16>::value, PixelDataType::Type, PixelDataType::UInt16, PixelDataType::Auto> checker2;
   pixelType = checker2.m_value;

   ...

}
Run Code Online (Sandbox Code Playgroud)

我知道这个例子没有多大意义,但我使用该代码在编译时设置枚举的值.所以这是我的问题:在std/boost类型特征中是否有类似的东西?浏览引用时,我发现条件几乎完全符合我的要求,但只生成一个类型,而不是一个值.

编辑:

更新的例子.

EDIT2:

我刚刚意识到的boost :: is_same ::值是所有我需要解决我problem.-至于问题的答案:似乎没有被列入有很好的理由STD /升压任何事,因为指出thiton

编辑3: 如果您仍在寻找在编译时创建值的解决方案,您可以使用我的代码.如果你正在寻找非常接近boost/stl的东西KerrekNawaz似乎也是有效的解决方案.如果你正在寻找一个在编译时分配正确枚举的解决方案,Luc Touraille的方法似乎很有意思,即使我认为这对我的情况来说太过分了!

Ker*_* SB 5

在某些情况下组合std::conditionalstd::integral_constant可能起作用:

template <bool B, typename T, T trueval, T falseval>
struct conditional_val : std::conditional<B,
       std::integral_constant<T, trueval>,
       std::integral_constant<T, falseval>>::type
{ };
Run Code Online (Sandbox Code Playgroud)

现在使用:

const int q = conditional_val<B, int, 12, -8>::value;
Run Code Online (Sandbox Code Playgroud)

等价的:

const int q = B ? 12 : -8;
Run Code Online (Sandbox Code Playgroud)