Шаблонный конструктор из себя же по другому типу
От: minorlogic Украина  
Дата: 01.08.11 07:09
Оценка:
Подскажите как делать кошерно

Псевдокод

    template <typename Real>
    class Class1
    {
    public:

        Class1()
        {
        }

        // без следующего объявления нет доступа к p.m_data в конструкторе. Есть другие варианты ?    
        template <typename U>
        friend class ISPointT;

        template<typename U>
         ISPointT(const ISPointT<U>& p)
         :
            m_data(p.m_data.begin(), p.m_data.end())        {
        }

    private:
               std::vector  m_data;
    };



Спасибо.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: Шаблонный конструктор из себя же по другому типу
От: uzhas Ниоткуда  
Дата: 01.08.11 07:22
Оценка: 8 (1) +1
Здравствуйте, minorlogic, Вы писали:

M>Подскажите как делать кошерно


M>Псевдокод

приведите код и ошибку компиляции
лучше на ideone.com
Re: Шаблонный конструктор из себя же по другому типу
От: minorlogic Украина  
Дата: 01.08.11 07:42
Оценка:
Извините за мороз , запостил фигню. Вот код пример.

#include<vector>

template <typename Real>
class Class1
{
public:

    Class1()
    {
        m_data.push_back( Real() );
    }

    // без следующего объявления нет доступа к p.m_data в конструкторе. Есть другие варианты ?    
    template <typename U>
    friend class Class1;

    template<typename U>
        Class1(const Class1<U>& p)
        :
        m_data(p.m_data.begin(), p.m_data.end())        {
    }

private:
    std::vector<Real>  m_data;
};
 

int main(int argc, char* argv[])
{

    Class1<int>    a;
    Class1<double> b(a);

    return 0;


Спасибо
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Шаблонный конструктор из себя же по другому типу
От: minorlogic Украина  
Дата: 01.08.11 07:42
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, minorlogic, Вы писали:


M>>Подскажите как делать кошерно


M>>Псевдокод

U>приведите код и ошибку компиляции
U>лучше на ideone.com
Не сростается с ideone.com

#include<vector>

template <typename Real>
class Class1
{
public:

    Class1()
    {
        m_data.push_back( Real() );
    }

    // без следующего объявления нет доступа к p.m_data в конструкторе. Есть другие варианты ?    
    template <typename U>
    friend class Class1;

    template<typename U>
        Class1(const Class1<U>& p)
        :
        m_data(p.m_data.begin(), p.m_data.end())        {
    }

private:
    std::vector<Real>  m_data;
};
 

int main(int argc, char* argv[])
{

    Class1<int>    a;
    Class1<double> b(a);

    return 0;


Спасибо.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Шаблонный конструктор из себя же по другому типу
От: zaufi Земля  
Дата: 01.08.11 08:45
Оценка: 11 (2)
без знаний о том, что это за класс (т.е. какую сущьность из предметной области (какой?) он представляет), зачем нужен и как используется, в частности какие дополнительные методы у него есть, доступен ли снаружи m_data, можно только сказать, что в предъявленном коде других вариантов кроме как friend, а именно это вызывает сомнения в "кошерности"", тут нет! и да, friend это последнее к чему стоит прибегать при дизайне классов: слишком много знать о чужих внутренностях не клево, хотя тут какбы тотже самый класс, но инстанциирован другим типом... но можно тоже навернуть всякого учитывая возможные специализации, взаимо конвертируемость типов которыми инстанциируется шаблон и прочее и прочее...

я бы сделал примерно так
0) обеспечил бы доступ снаружи (хотябы константный) к m_data (если этот вектор хранит что-то такое, что хоть как-то интересно снаружи класса... т.е. не является сугубо личным состоянием данного класса).
1) шаблонный конструктор принимал бы ссылку на класс инстанциированный другим Real типом, или, что imho лучше, пару forward итераторов в sequence -- т.е. просто в любой вообще совместимый sequence
2) шаблонный конструктор с помощью enable_if виден только если Real type данного контейнера (или value_type итератора) convertible в Real type текущего контейнера

в общем нужно больше инфы о том что ты делаешь и зачем, чтобы сказать что-нить полезное...

както так в целом.
Re[3]: Шаблонный конструктор из себя же по другому типу
От: Kolobrodin Россия  
Дата: 01.08.11 08:50
Оценка: 4 (1)
Здравствуйте, minorlogic, Вы писали:

Class1<int> и Class1<double> это разные типы, потому и нужно френдование.

Но, по хорошему, надо плясать от того, для чего нужны такие классы,
в случае, например, если это обертка над контейнером: begin()-end() наружу выставлять
и их использовать.
Неоконченная мысль всегда казалась Шри Япутре слишком
Re[3]: Шаблонный конструктор из себя же по другому типу
От: minorlogic Украина  
Дата: 01.08.11 12:23
Оценка:
Используется в коде проводящем расчеты.

Копирование внутренностей нужно для проведения тех же инструментированных расчетов. Когда вместо double используются перегруженные типы (например бОльшей точности).
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Шаблонный конструктор из себя же по другому типу
От: uzhas Ниоткуда  
Дата: 01.08.11 13:05
Оценка:
Здравствуйте, minorlogic, Вы писали:


M>Не сростается с ideone.com

у меня все хорошо срастается
http://ideone.com/okjMr
причина банальна: класс Class1<Real> не имеет доступа к кишкам класса Class1<U>
чтобы решить эту проблему, достаточно пропилить функции доступа к кишкам, которые нужны для копирования в шаблонном классе Class1
френдовость использовать нынче не модно
Re[4]: Шаблонный конструктор из себя же по другому типу
От: minorlogic Украина  
Дата: 01.08.11 17:26
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, minorlogic, Вы писали:



M>>Не сростается с ideone.com

U>у меня все хорошо срастается
U>http://ideone.com/okjMr
U>причина банальна: класс Class1<Real> не имеет доступа к кишкам класса Class1<U>
U>чтобы решить эту проблему, достаточно пропилить функции доступа к кишкам, которые нужны для копирования в шаблонном классе Class1
U>френдовость использовать нынче не модно

Это то что лежит на поверхности , я думаю, может упустил че...
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Шаблонный конструктор из себя же по другому типу
От: zaufi Земля  
Дата: 01.08.11 20:19
Оценка: :)
Здравствуйте, minorlogic, Вы писали:

M>Используется в коде проводящем расчеты.

))) твое описание не добавляет ясности вообще! что используется в расчетах? класс целиком или m_data из него? (думаю, что это, возможо, не единственный data member класса). "расчеты" это методы класса или внешние функции?

судя по тому, как тебя приходится буквально пытать, чтобы ты сказал больше, ты пишешь чота военное?

M>Копирование внутренностей нужно для проведения тех же инструментированных расчетов. Когда вместо double используются перегруженные типы (например бОльшей точности).
Re[5]: Шаблонный конструктор из себя же по другому типу
От: minorlogic Украина  
Дата: 01.08.11 20:40
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, minorlogic, Вы писали:


M>>Используется в коде проводящем расчеты.

Z>))) твое описание не добавляет ясности вообще! что используется в расчетах? класс целиком или m_data из него?

Набор классов.

Z>(думаю, что это, возможо, не единственный data member класса). "расчеты" это методы класса или внешние функции?


Не единственный конечно , внутренности достаточно неординарные и могут меняться в отличие от внешнего интерфейса класса.

Z>судя по тому, как тебя приходится буквально пытать, чтобы ты сказал больше, ты пишешь чота военное?


Это показалось.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.