В настоящее время я делаю следующее для генерации значения во время компиляции, что работает:
//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)
{}
};
Тогда вы можете просто сделать что-то вроде этого:
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;
...
}
Я знаю, что этот пример не имеет особого смысла, но я использую этот код для установки значения enum во время компиляции. Так вот мой вопрос: Есть ли что-то подобное в чертах типа std / boost allready? При просмотре ссылки я нашел только условное , которое делает почти то, что я хочу, но генерирует только тип, а не значение.
EDIT:
Обновленный пример.
Edit2:
Я только что понял, что boost :: is_same :: value - это все, что мне нужно для решения моей проблемы. Что касается ответа на вопрос: похоже, что в std / boost ничего не включено по веской причине, как указано титон
EDIT3:
Если вы все еще ищете решение для создания значения во время компиляции, вы можете использовать мой код, который работает. Если вы ищете что-то очень близкое к boost / stl Kerrek's или Nawaz , то, кажется, также являются правильными решениями. Если вы ищете решение, которое присваивает правильное перечисление во время компиляции Luc Touraille подход кажется интересным, хотя я решил, что это излишне для моей ситуации!