LINUX.ORG.RU

C++ Type deduction

 ,


0

2

Всем привет!

Предположим, у меня есть шаблонный класс а-ля такого:

template<class T> my_data
{
    //....
};

template<class strategy>
    class my_class : strategy
    {
        private:
            template<class T> my_data<T> data;
        public:
            template<class T>
                my_class (const my_data<T>& d): data(d){}
    };

// Usage:
my_data<char*> data;
my_class<strategy>(data);

Вопрос в следующем - компилятор догадается, какой выставить тип Т внутри my_class, исходя из данных, передаваемых в конструктор?

★★

Последнее исправление: aido (всего исправлений: 1)

компилятор догадается, какой выставить тип Т внутри my_class, исходя из данных, передаваемых в конструктор?

Да, но это

template<class T> my_data<T> data;
работать не будет.

xaizek ★★★★★
()
Ответ на: комментарий от aido

Использовать Type erasure. Это добавит полиморфизма времени исполнения, но раз тип не зависит прямо от шаблонных параметров самого класса, то так.

xaizek ★★★★★
()
Ответ на: комментарий от aido

Можно попробовать трюк с factory function:

template<typename strategy, typename T>
class my_class : strategy
{
private:
    my_data<T> data;
public:
    my_class (const my_data<T>& d): data(d){}
};

template<typename strategy, typename T>
auto create_my_class(const my_data<T>& d)
{
    return my_class<strategy, T>(d);
}

my_data<char*> data;
auto my_class = create_my_class<strategy>(data);
anonymous
()
Ответ на: комментарий от anonymous

трюк с factory function

Это классический путь. В C++17 можно сделать то же чуть красивше с помощью deduction guides.

const86 ★★★★★
()
template <typename T>
struct A {
    using SomeType = T;
};

template <typename T>
struct B : T {
    T::SomeType data;
    B(const T::SomeType & data) : data(data) {}
};
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.