2016-08-21 6 views
0

Если у меня есть перечисление определяется как ...Специализированный возврат шаблона/установить значение перечисления на основе переменного типа

enum MyValue 
{ 
    Unk, 
    A, 
    B 
}; 

Я хочу создать специализированный шаблон, возвращающий/установить тип на основе переменного введите себя

template<typename T> 
struct get_value 
{ 
    // the 'value' should be MyValue::Unk 
}; 

template<> 
struct get_value<int> 
{ 
    // the 'value' should be MyValue::A 
}; 

template<> 
struct get_value<double> 
{ 
    // the 'value' should be MyValue::B 
}; 

Таким образом, я мог бы назвать STRUCT

auto x = get_value<char>::value; // == MyValue::Unk 

И

auto y = get_value<int>::value; // == MyValue::A 

Возможно ли это в C++, если да, то как это можно сделать?

ответ

1

С следующее:

template<typename T> 
struct get_value 
{ 
    static constexpr MyValue value = MyValue::Unk; 
}; 

template<> 
struct get_value<int> 
{ 
    static constexpr MyValue value = MyValue::A; 
}; 

template<> 
struct get_value<double> 
{ 
    static constexpr MyValue value = MyValue::B; 
}; 

Demo

+0

Так просто :) спасибо –

1

C++ 14 добавляет Variable templates, вы можете их использовать:

namespace get_value { 
    template<typename T> 
    constexpr MyValue value = MyValue::Unk; 

    template<> 
    constexpr MyValue value<int> = MyValue::A; 

    template<> 
    constexpr MyValue value<double> = MyValue::B; 
} 

Они используются немного по-другому, хотя:

int main() { 
    std::cout << get_value::value<char> << std::endl; 
    std::cout << get_value::value<int> << std::endl; 
    std::cout << get_value::value<double> << std::endl; 
} 
+0

Это отлично работает, я думаю, это вопрос стиля/вкуса, но в этом случае я предпочитаю другой метод. –

Смежные вопросы