Вывод аргумента шаблона класса из аргументов конструктора
От: licch Россия  
Дата: 04.06.10 16:08
Оценка:
Вот код:


#include <vector>

template <class Elem>
class SomeClass
{
public:
    vector<Elem> vec;
    SomeClass (const vector<Elem> &vec_): vec(vec_){}
};

int main (void)
{
    vector<int> vec;
    SomeClass<int> sc1(vec); // ок
    SomeClass sc2(vec); // не ок
}


Если указывать класс элемента явно, то естественно всё работает. Можно как-нибудь изменить конструктор так, чтобы и вторая строка заработала?
Re: Вывод аргумента шаблона класса из аргументов конструктор
От: saf_e  
Дата: 04.06.10 16:17
Оценка:
Здравствуйте, licch, Вы писали:

L>Вот код:



L>
L>#include <vector>

L>template <class Elem>
L>class SomeClass
L>{
L>public:
L>    vector<Elem> vec;
L>    SomeClass (const vector<Elem> &vec_): vec(vec_){}
L>};

L>int main (void)
L>{
L>    vector<int> vec;
L>    SomeClass<int> sc1(vec); // ок
L>    SomeClass sc2(vec); // не ок
L>}
L>


L>Если указывать класс элемента явно, то естественно всё работает. Можно как-нибудь изменить конструктор так, чтобы и вторая строка заработала?


Нет, идет нарушение синтаксиса. Тип шаблона должен указываться явно. (ну или косвенно

иначе возможно было бы:

 vector<double> d_vec;
 vector<int> vec;
 SomeClass sc1(vec), sc2(d_vec); // уже интересно, типы с виду одинаковые
 sc1 = sc2; // А что тут делать?


Более того не допустима даже такая конструкция:

class SomeClass
{
public:
        template<T>
    SomeClass() {}
};


Т.е. тимплейтный конструктор тип которого не может быть явно определен.
Re: Вывод аргумента шаблона класса из аргументов конструктор
От: Vamp Россия  
Дата: 04.06.10 16:23
Оценка:
L>Если указывать класс элемента явно, то естественно всё работает. Можно как-нибудь изменить конструктор так, чтобы и вторая строка заработала?
Нет, нельзя. Тип переменной sc2 должен быть указан явно.

Что можно сделать?
Унаследовать твой шаблонный SomeClass от нешаблонного и сделать функцию-мейкер.
Примерно так (не компилировал)


class base {
     //interface goes here
     ....
};


template <class T>
class derived : public base {
//data memebers and implementation
....
};


typedef const base& MyClass;


template <class T>
base create_class(T ...) {
    derived<T> t;    
    ...
}


void main () {
     MyClass class = create_class(var);
}
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Вывод аргумента шаблона класса из аргументов конструк
От: Vamp Россия  
Дата: 04.06.10 16:26
Оценка: 2 (1)
V>Примерно так (не компилировал)
Самокоррекция.




class base {
     //interface goes here
     ....
};


template <class T>
class derived : public base {
//data memebers and implementation
....
};


typedef const base& MyClass;



//CORRECTED
template <class T>
derived<T> create_class(T ...) {
    derived<T> t;    
    ...
}


void main () {
     MyClass class_instance = create_class(var);
}
Да здравствует мыло душистое и веревка пушистая.
Re: Вывод аргумента шаблона класса из аргументов конструктор
От: Guard_h4s Россия  
Дата: 04.06.10 16:32
Оценка:
Для решения аналогичной проблемы используют функции — make_pair() например
Re[3]: Вывод аргумента шаблона класса из аргументов конструк
От: remark Россия http://www.1024cores.net/
Дата: 04.06.10 17:55
Оценка:
Здравствуйте, Vamp, Вы писали:

V>
V>void main () {
V>     MyClass class_instance = create_class(var);
V>}
V>


int main()
{
  auto x = create_x(var);
}



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Вывод аргумента шаблона класса из аргументов конструк
От: Ops Россия  
Дата: 04.06.10 18:02
Оценка:
Здравствуйте, remark, Вы писали:

R>
R>int main()
R>{
R>  auto x = create_x(var);
R>}
R>


R>


А что, стандарт уже приняли?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: Вывод аргумента шаблона класса из аргументов конструк
От: Vamp Россия  
Дата: 04.06.10 18:03
Оценка: +1 :)
R> auto x = create_x(var);

Ну не всем же так повезло!
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Вывод аргумента шаблона класса из аргументов конструк
От: remark Россия http://www.1024cores.net/
Дата: 04.06.10 18:04
Оценка:
Здравствуйте, Ops, Вы писали:

R>>
R>>int main()
R>>{
R>>  auto x = create_x(var);
R>>}
R>>


Ops>А что, стандарт уже приняли?


Я не Александреску, что бы писать программы на бумажке по стандарту. Я компиляторы использую.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: Вывод аргумента шаблона класса из аргументов конструк
От: Ops Россия  
Дата: 04.06.10 18:13
Оценка:
Здравствуйте, remark, Вы писали:

R>Я не Александреску, что бы писать программы на бумажке по стандарту. Я компиляторы использую.


Вроде их всего 2 таких, из распространенных, и не факт, что человек использует один из них.

Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[7]: Вывод аргумента шаблона класса из аргументов конструк
От: remark Россия http://www.1024cores.net/
Дата: 04.06.10 18:17
Оценка:
Здравствуйте, Ops, Вы писали:

R>>Я не Александреску, что бы писать программы на бумажке по стандарту. Я компиляторы использую.


Ops>Вроде их всего 2 таких, из распространенных, и не факт, что человек использует один из них.


Все основные промышленные компиляторы поддерживают auto — MSVC, ICC, gcc. Ну а что до CC, так там тоже gcc доступен.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: Вывод аргумента шаблона класса из аргументов конструк
От: Ops Россия  
Дата: 04.06.10 18:20
Оценка:
Здравствуйте, remark, Вы писали:


R>Все основные промышленные компиляторы поддерживают auto — MSVC, ICC, gcc. Ну а что до CC, так там тоже gcc доступен.


Все, вопрос — с какой версии.

Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[9]: Вывод аргумента шаблона класса из аргументов конструк
От: remark Россия http://www.1024cores.net/
Дата: 04.06.10 18:22
Оценка: 3 (1) -1
Здравствуйте, Ops, Вы писали:

R>>Все основные промышленные компиляторы поддерживают auto — MSVC, ICC, gcc. Ну а что до CC, так там тоже gcc доступен.


Ops>Все, вопрос — с какой версии.


С существующей.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: Вывод аргумента шаблона класса из аргументов констру
От: Тролль зеленый и толстый  
Дата: 04.06.10 19:26
Оценка:
Не надо ля-ля. В iPhone SDK используется GCC 4.2, в Symbian — вообще 3.4.2.
Re[11]: Вывод аргумента шаблона класса из аргументов констру
От: remark Россия http://www.1024cores.net/
Дата: 04.06.10 19:36
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

ТЗИ>Не надо ля-ля. В iPhone SDK используется GCC 4.2, в Symbian — вообще 3.4.2.


И что нельзя проапдейтить?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[12]: Вывод аргумента шаблона класса из аргументов констру
От: Тролль зеленый и толстый  
Дата: 05.06.10 07:34
Оценка: +1
R>И что нельзя проапдейтить?

Неизвестно, может и можно, но, скорее всего, сложно. Я пока решил, что фичи в C++ 0x, конечно, приятные, но их использование не создаст такого экономического эффекта, чтобы оправдать возможные затраты времени на обновление компиляторов в SDK и риск того, что что-нибудь сломается.

А с официальной поддержкой пока вопрос.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.