LINUX.ORG.RU

История изменений

Исправление dissident, (текущая версия) :

А можно с примерами про два return'а с разными типами? Просто auto не заработает? Речь о чем-то вроде https://stackoverflow.com/questions/32885112/template-function-to-return-tupl... ?

Убрал decltype, в C++14 продолжает работать:

#include <iostream>
#include <string>
#include <tuple>

// IDs
enum class ID : size_t
{
    AAA, // 0
    BBB, // 1
    CCC, // 2
    DDD  // 3
};

// default values for each ID
const auto defaultValsForIDs = std::make_tuple(
        int(1),             // 0
        std::string("bbb"), // 1 
        double(3.5),        // 2
        int(-5)             // 3
);

template<typename EnumT>
using underlayingEnumT = typename std::underlying_type<EnumT>::type;

template<typename EnumT>
constexpr underlayingEnumT<EnumT> to_underlying(EnumT e) 
{
    return static_cast<underlayingEnumT<EnumT>>(e);
}

template<typename EnumT, EnumT e>
auto getDefaultValue() 
//	-> decltype(std::get<to_underlying<EnumT>(e)>(defaultValsForIDs))
{
    return std::get<to_underlying<EnumT>(e)>(defaultValsForIDs);
}

template<ID id>
auto getDefaultValForID() 
//	-> decltype(getDefaultValue<ID, id>())
{
    return getDefaultValue<ID,id>();
}

int main()
{
    std::cout << getDefaultValForID<ID::BBB>() << std::endl;
    return 0;
}

Или речь о чем-то другом?

Исправление dissident, :

А можно с примерами про два return'а с разными типами? Просто auto не заработает? Речь о чем-то вроде https://stackoverflow.com/questions/32885112/template-function-to-return-tupl... ?

Убрал decltype, в C++14 продолжает работать:

#include <iostream>
#include <string>
#include <tuple>

// IDs
enum class ID : size_t
{
    AAA, // 0
    BBB, // 1
    CCC, // 2
    DDD  // 3
};

// default values for each ID
const auto defaultValsForIDs = std::make_tuple(
        int(1),             // 0
        std::string("bbb"), // 1 
        double(3.5),        // 2
        int(-5)             // 3
);

template<typename EnumT>
using underlayingEnumT = typename std::underlying_type<EnumT>::type;

template<typename EnumT>
constexpr underlayingEnumT<EnumT> to_underlying(EnumT e) 
{
    return static_cast<underlayingEnumT<EnumT>>(e);
}

template<typename EnumT, EnumT e>
auto getDefaultValue() 
//	-> decltype(std::get<to_underlying<EnumT>(e)>(defaultValsForIDs))
{
    return std::get<to_underlying<EnumT>(e)>(defaultValsForIDs);
}

template<ID id>
auto getDefaultValForID() 
//	-> decltype(getDefaultValue<ID, id>())
{
    return getDefaultValue<ID,id>();
}

int main()
{
    std::cout << getDefaultValForID<ID::BBB>() << std::endl;
    return 0;
}

Исправление dissident, :

А можно с примерами про два return'а с разными типами? Просто auto не заработает? Речь о чем-то вроде https://stackoverflow.com/questions/32885112/template-function-to-return-tupl... ?

Исходная версия dissident, :

А можно с примерами про два return'а с разными типами? Просто auto не заработает? Речь о чем-то вроде https://stackoverflow.com/questions/32885112/template-function-to-return-tupl...