Помощь в написании шаблонной функции C++

158
19 декабря 2018, 03:50

прошу опытных товарищей подсказать как лучше реализовать шаблонную функцию. Предположим у меня есть такая структура:

struct MediaData
    {
        static void Init();
        static boost::shared_ptr<MediaData> ConstructorWithTupleHandler(const boost::python::tuple& tuple);
        static boost::shared_ptr<MediaData> ConstructorWithStringHandler(const std::string& str);
        static std::string __str__(const MediaData& mediaData);
        static std::string __repr__(const MediaData& mediaData);
        static const size_t mediaDataLen = 1024;
        BYTE* data();
    private:
        std::array<BYTE, mediaDataLen> m_mediaData;
    };

Функция ConstructorWithTupleHandler имеет данную реализацию:

boost::shared_ptr<MediaData> MediaData::ConstructorWithTupleHandler(const boost::python::tuple& tuple)
{
    auto mediaData = new MediaData;
    for (size_t i = 0; i < min(boost::python::len(tuple), mediaDataLen); ++i)
    {
        mediaData->m_mediaData[i] = boost::python::extract<BYTE>(tuple[i]);
    }
    return boost::shared_ptr< MediaData >(mediaData);
}

Вопрос вот в чем: у меня имеется не одна структура подобной MediaData у которых различие в поле static const size_t mediaDataLen и в поле std::array m_mediaData. Расскажите пожалуйста, как можно для данной функции написать функцию - шаблон, чтобы избежать повторов в коде. Заранее благодарен за ответ.

Answer 1

Логичнее, на мой взгляд, это вынести в отдельный статический метод:

template<typename _DataStruct>
static boost::shared_ptr<_DataStruct> ConstructorWithTupleHandler(const boost::python::tuple& tuple)
{
    auto data = _DataStruct::ArrayType();   
    for (size_t i = 0; i < min(boost::python::len(tuple), _DataStruct::DataLen); ++i)
        data[i] = boost::python::extract<typename _DataStruct::ArrayType::value_type>(tuple[i]);
    return boost::make_shared<_DataStruct>(std::move(data));
}
struct MediaData
{
    static constexpr size_t DataLen = 1024;
    using ArrayType = std::array<BYTE, DataLen>;
    MediaData(ArrayType data) : m_mediaData(std::move(data)) {}
    /*...*/
private:
    ArrayType m_mediaData;
};
READ ALSO
Ошибка совместимости типов

Ошибка совместимости типов

Я хочу объявить тип long long double , но компилятор выдает ошибку, так как для него это все равно,что объявление int doubleМожно ли все-таки объявить...

149
emplace_back для шаблонного конструктора

emplace_back для шаблонного конструктора

Есть класс (не шаблонный и шаблонным его делать нельзя) с шаблонным конструктором:

169
создание двухбайтной строки

создание двухбайтной строки

Беру число из массива и перевожу в строку в связи с тем что работать надо с битами

173
java config объектов

java config объектов

У меня есть класс простого объекта, например man, с двумя полями name и ageИ мне нужно, чтоб при старте программы, считывался текстовый конфигурационный...

184