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的东西Kerrek或Nawaz似乎也是有效的解决方案.如果你正在寻找一个在编译时分配正确枚举的解决方案,Luc Touraille的方法似乎很有意思,即使我认为这对我的情况来说太过分了!
在某些情况下组合std::conditional并std::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)