Re[8]: И опять синтаксис шаблонов...
От: remark Россия http://www.1024cores.net/
Дата: 03.10.05 13:48
Оценка:
Здравствуйте, CrystaX, Вы писали:

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


R>>Нет, он мне нужен, и именно в конструкторе.


CX>Выходит, что тебе все-таки нужен ParamTraits, а вывести его из зависимого имени ParamType не получится. Поэтому его надо указывать явно.


R>>Если быть более точным, то пример примерно такой:


R>>
R>>// Структура задаёт тип параметра, который принимает конструктор
R>>template<typename Type>
R>>struct ParamTraits
R>>{
R>>    typedef Type1 ParamType1;
R>>    typedef Type2 ParamType2;
R>>    typedef Type3 ParamType3;
R>>};


R>>// Основной класс
R>>class Test
R>>{
R>>public:
R>>    // Шаблонный конструктор
R>>    // принимает параметр типа, который определяется ParamTraits
R>>    template<typename Type>
R>>    Test(int, typename ParamTraits<Type>::ParamType1 param1, typename ParamTraits<Type>::ParamType2 param2, typename ParamTraits<Type>::ParamType3 param3);
R>>};
R>>


R>>И без TypeTraits тут сделать не получается.


CX>Я не совсем понимаю. Зачем здесь ParamTraits? Для автоматического выведения типа? Так это в любом случае не получится. Или еще для чего?



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

Для int:

Test::Test(int& value, int defaultValue);


Для std::string:

Test::Test(std::string& value, const std::stirng& defaultValue);


Для char*:

Test::Test(char* buf, const std::stirng& defaultValue);



В принципе можно немного переформулировать постановку задачи:
здесь
Автор: remark
Дата: 03.10.05

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[6]: И опять синтаксис шаблонов...
От: CrystaX Россия https://crystax.me/
Дата: 03.10.05 13:50
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Так это же вроде уже выяснили. Глюк VC, Комо замечательно компилит явное инстанцирование конструкторов независимо от выводимости аргументов шаблона.


Не совсем так. В случае, если типы невыводимы из аргументов, Комо выдает ошибку. Первоначальный пример он не компилирует. Но если изменить шаблон INSTANTIATE_TEST, указав явно тип, с которым нужно инстанцировать, все пройдет на ура. К сожалению, VC 7.1 содержит баг, заключающийся в том, что явное инстанцирование шаблонов конструкторов он не производит при явном указании типа.
#define INSTANTIATE_TEST(Type) template Test::Test(ParamTraits<Type>::ParamType) // Так неверно
#define INSTANTIATE_TEST(Type) template Test::Test<Type>(ParamTraits<Type>::ParamType) // А вот так все ОК, но не для VC 7.1
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: И опять синтаксис шаблонов...
От: Глеб Алексеев  
Дата: 03.10.05 13:51
Оценка: 3 (1) +1
Здравствуйте, remark, Вы писали:

R>Хорошо, понял.

R>А если изменить условия, т.ч. первый аргумент конструктора всегда int, второй — всегда Type (сам параметр шаблона), а второй через traits, т.е. так сказать сдвинуть точку отсчёта в первый шаблонный параметр.

R>
R>    template<typename Type>
R>    Test(int, Type type, typename ParamTraits<Type>::ParamType param);
R>

R>Так получиться?

Получится, но опять через ..гм, Амстердам, т.к. VC и в этом случае будет глючить при попытке явно инстанцировать, нужно идти в обход (варианты уже предлагались).
Сделай проще:
#include <string>

template <class T>
struct traits {
  typedef T type; 
};

template <>
struct traits<std::string> {
  typedef const std::string& type; 
};


struct A {
  template <class T, class P>
    A(T t, P p /* раньше вместо P был typename traits<T>::type */) {
    }
};


template A::A(std::string, traits<std::string>::type);
template A::A(int, traits<int>::type);

Не страшно, что типы T и P в объявлении конструктора никак не связаны, т.к. он инстанцируется явно и допустимые типы все равно под твоим контролем (правда, диагностика ошибок сдвинется на фазу компоновки).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: И опять синтаксис шаблонов...
От: Глеб Алексеев  
Дата: 03.10.05 13:53
Оценка:
Здравствуйте, CrystaX, Вы писали:

ГА>>Так это же вроде уже выяснили. Глюк VC, Комо замечательно компилит явное инстанцирование конструкторов независимо от выводимости аргументов шаблона.

CX>Не совсем так. В случае, если типы невыводимы из аргументов, Комо выдает ошибку. Первоначальный пример он не компилирует. Но если изменить шаблон INSTANTIATE_TEST, указав явно тип, с которым нужно инстанцировать, все пройдет на ура. К сожалению, VC 7.1 содержит баг, заключающийся в том, что явное инстанцирование шаблонов конструкторов он не производит при явном указании типа.
CX>
CX>#define INSTANTIATE_TEST(Type) template Test::Test(ParamTraits<Type>::ParamType) // Так неверно
CX>#define INSTANTIATE_TEST(Type) template Test::Test<Type>(ParamTraits<Type>::ParamType) // А вот так все ОК, но не для VC 7.1
CX>

Я имел в виду, что Комо справляется со вторым случаем.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: И опять синтаксис шаблонов...
От: CrystaX Россия https://crystax.me/
Дата: 03.10.05 13:57
Оценка:
Здравствуйте, remark, Вы писали:

R>В принципе можно немного переформулировать постановку задачи:

R>здесь
Автор: remark
Дата: 03.10.05


Все равно не понимаю, какие из этого выгоды. У тебя что, во всех случаях одно и то же тело конструктора? Или все-таки разное? И еще — каким образом в данной ситуации может помочь явное инстанцирование?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[10]: И опять синтаксис шаблонов...
От: remark Россия http://www.1024cores.net/
Дата: 03.10.05 14:06
Оценка:
Здравствуйте, CrystaX, Вы писали:

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


R>>В принципе можно немного переформулировать постановку задачи:

R>>здесь
Автор: remark
Дата: 03.10.05


CX>Все равно не понимаю, какие из этого выгоды. У тебя что, во всех случаях одно и то же тело конструктора?

А что такого? Нельзя?
Да, тело одинаковое и шаблонное, т.е. в нём тоже вызываются шаблонные функции.

CX>Или все-таки разное? И еще — каким образом в данной ситуации может помочь явное инстанцирование?


Явное инстанциирование нужно, что бы не было модели включения, что бы компилировать в каждом файле кучу шаблонов, + типы для которых надо инстанциировать известны и фиксированы + это всё будет в библиотеке .lib

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: И опять синтаксис шаблонов...
От: remark Россия http://www.1024cores.net/
Дата: 03.10.05 14:08
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, remark, Вы писали:


R>>Хорошо, понял.

R>>А если изменить условия, т.ч. первый аргумент конструктора всегда int, второй — всегда Type (сам параметр шаблона), а второй через traits, т.е. так сказать сдвинуть точку отсчёта в первый шаблонный параметр.

R>>
R>>    template<typename Type>
R>>    Test(int, Type type, typename ParamTraits<Type>::ParamType param);
R>>

R>>Так получиться?

ГА>Получится, но опять через ..гм, Амстердам, т.к. VC и в этом случае будет глючить при попытке явно инстанцировать, нужно идти в обход (варианты уже предлагались).

ГА>Сделай проще:

...

ГА>Не страшно, что типы T и P в объявлении конструктора никак не связаны, т.к. он инстанцируется явно и допустимые типы все равно под твоим контролем (правда, диагностика ошибок сдвинется на фазу компоновки).



Ясно. Спасибо. Вариант хороший. Значит всё-таки это msvc глючит...
Правда речь идёт о классе из библиотеки. Пока это выглядело как:

Test::Test(int& value, int defaultValue);
Test::Test(std::string& value, const std::stirng& defaultValue);
Test::Test(char* buf, const std::stirng& defaultValue);


Было всё достаточно понятно, а так :

 template <class T, class P>
A(T t, P p);





Ну ладно придётся документировать.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[11]: И опять синтаксис шаблонов...
От: CrystaX Россия https://crystax.me/
Дата: 03.10.05 14:13
Оценка:
Здравствуйте, remark, Вы писали:

R>А что такого? Нельзя?

R>Да, тело одинаковое и шаблонное, т.е. в нём тоже вызываются шаблонные функции.

Можно. Но у меня сложилось впечатление, что тело разное.

CX>>Или все-таки разное? И еще — каким образом в данной ситуации может помочь явное инстанцирование?


R>Явное инстанциирование нужно, что бы не было модели включения, что бы компилировать в каждом файле кучу шаблонов, + типы для которых надо инстанциировать известны и фиксированы + это всё будет в библиотеке .lib


Ну это-то понятно. Просто показалось, что ты таким образом пытаешься наложить определенные ограничения compile- и/или link-time.

... << RSDN@Home 1.1.4 stable rev. 510>>
Re[9]: И опять синтаксис шаблонов...
От: Глеб Алексеев  
Дата: 03.10.05 14:36
Оценка: 1 (1)
Здравствуйте, remark, Вы писали:


R>Ясно. Спасибо. Вариант хороший. Значит всё-таки это msvc глючит...

R>Правда речь идёт о классе из библиотеки. Пока это выглядело как:
R>
R>Test::Test(int& value, int defaultValue);
R>Test::Test(std::string& value, const std::stirng& defaultValue);
R>Test::Test(char* buf, const std::stirng& defaultValue);
R>

R>Было всё достаточно понятно, а так :
R>
R> template <class T, class P>
R>A(T t, P p);
R>

Вот здесь ты противоречишь сам себе. Недавно ты говорил, что перегрузок конструкторов для всех типов параметров нет, точнее, ты хочешь от них избавиться.
Кроме того, для среднего пользователя
template <class T>
A(T& value, typename traits<T>::type dflt);

будет выглядеть не понятнее, чем
template <class T, class P>
A(T& value , P default);


В любом случае, сам шаблонный конструктор вида template <class T, class P> A(...) можно перенести в закрытый базовый класс, а в интерфейсной части библиотеки использовать либо множество перегруженных конструкторов, либо вариант с traits. Как-нибудь так:
//lib.hpp
namespace detail {
struct a_base {
  template <class T, class P>
    a_base(T& , P);
};
}
struct a : private detail::a_base {
  template <class T>
    a(T& val, typename traits<T>::type dflt) : a_base(val, dflt) {
    }
};

//lib.cpp
namespace detail {
template <class T, class P>
a_base::a_base(T& , P) {
// implementation
}
template a_base::a_base(string, traits<string>::type);
template a_base::a_base(int, traits<int>::type);
// ...
}


R>Ну ладно придётся документировать.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: И опять синтаксис шаблонов...
От: remark Россия http://www.1024cores.net/
Дата: 03.10.05 14:46
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Вот здесь ты противоречишь сам себе. Недавно ты говорил, что перегрузок конструкторов для всех типов параметров нет, точнее, ты хочешь от них избавиться.


Да так и есть. Не понял.

ГА>Кроме того, для среднего пользователя

ГА>
ГА>template <class T>
ГА>A(T& value, typename traits<T>::type dflt);
ГА>

ГА>будет выглядеть не понятнее, чем
ГА>
ГА>template <class T, class P>
ГА>A(T& value , P default);
ГА>


Согласен. Надо просто их переназвать — не T и P, а типа ValueType и ReferenceType.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[11]: И опять синтаксис шаблонов...
От: Глеб Алексеев  
Дата: 03.10.05 14:53
Оценка:
Здравствуйте, remark, Вы писали:

ГА>>Вот здесь ты противоречишь сам себе. Недавно ты говорил, что перегрузок конструкторов для всех типов параметров нет, точнее, ты хочешь от них избавиться.

R>Да так и есть. Не понял.

Разве ты не говорил:
R>Правда речь идёт о классе из библиотеки. Пока это выглядело как:
R>Test::Test(int& value, int defaultValue);
R>Test::Test(std::string& value, const std::stirng& defaultValue);
R>Test::Test(char* buf, const std::stirng& defaultValue);

R>Было всё достаточно понятно,
?

R>Согласен. Надо просто их переназвать — не T и P, а типа ValueType и ReferenceType.

Тогда уж не ReferenceType, а ArgumentType.
А еще лучше сделать так, как я предложил (с базовым классом), тогда еще и диагностика на стадии компиляции будет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: И опять синтаксис шаблонов...
От: remark Россия http://www.1024cores.net/
Дата: 04.10.05 08:07
Оценка:
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Здравствуйте, remark, Вы писали:


ГА>>>Вот здесь ты противоречишь сам себе. Недавно ты говорил, что перегрузок конструкторов для всех типов параметров нет, точнее, ты хочешь от них избавиться.

R>>Да так и есть. Не понял.

ГА>Разве ты не говорил:

R>>Правда речь идёт о классе из библиотеки. Пока это выглядело как:
ГА>
R>>Test::Test(int& value, int defaultValue);
R>>Test::Test(std::string& value, const std::stirng& defaultValue);
R>>Test::Test(char* buf, const std::stirng& defaultValue);
ГА>

R>>Было всё достаточно понятно,
ГА>?

Ну, да. Я хочу, что бы стало:

Test::Test(ParamType1 value, ParamType2 defaultValue);



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: И опять синтаксис шаблонов...
От: remark Россия http://www.1024cores.net/
Дата: 04.10.05 08:11
Оценка: :)
Здравствуйте, Глеб Алексеев, Вы писали:


ГА>В любом случае, сам шаблонный конструктор вида template <class T, class P> A(...) можно перенести в закрытый базовый класс, а в интерфейсной части библиотеки использовать либо множество перегруженных конструкторов, либо вариант с traits. Как-нибудь так:

ГА>
ГА>//lib.hpp
ГА>namespace detail {
ГА>struct a_base {
ГА>  template <class T, class P>
ГА>    a_base(T& , P);
ГА>};
ГА>}
ГА>struct a : private detail::a_base {
ГА>  template <class T>
ГА>    a(T& val, typename traits<T>::type dflt) : a_base(val, dflt) {
ГА>    }
ГА>};

ГА>//lib.cpp
ГА>namespace detail {
ГА>template <class T, class P>
ГА>a_base::a_base(T& , P) {
ГА>// implementation
ГА>}
ГА>template a_base::a_base(string, traits<string>::type);
ГА>template a_base::a_base(int, traits<int>::type);
ГА>// ...
ГА>}
ГА>



А вот это попробуйте



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: И опять синтаксис шаблонов...
От: CrystaX Россия https://crystax.me/
Дата: 04.10.05 11:37
Оценка: 1 (1) +1
Здравствуйте, remark, Вы писали:

Собственно, по сути это то же самое, что я предложил здесь
Автор: CrystaX
Дата: 03.10.05
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[10]: И опять синтаксис шаблонов...
От: remark Россия http://www.1024cores.net/
Дата: 04.10.05 11:50
Оценка:
Здравствуйте, CrystaX, Вы писали:

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


CX>Собственно, по сути это то же самое, что я предложил здесь
Автор: CrystaX
Дата: 03.10.05


Ну вообще, там
Автор: CrystaX
Дата: 03.10.05
идея тоже интересная.
Я всё-таки решил в итоге делать немного подругому:
Т.к. это один из основных классов, который торчит из библиотеки, я всё-таки вручную (через макросы) записал все возможные конструкторы. А в реализации (которая тоже сделана с помощью макросов) сразу же (в одну строчку) перенаправляю логику во внутреннюю шаблонную часть.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[11]: И опять синтаксис шаблонов...
От: CrystaX Россия https://crystax.me/
Дата: 04.10.05 11:54
Оценка:
Здравствуйте, remark, Вы писали:

R>Я всё-таки решил в итоге делать немного подругому:

R>Т.к. это один из основных классов, который торчит из библиотеки, я всё-таки вручную (через макросы) записал все возможные конструкторы. А в реализации (которая тоже сделана с помощью макросов) сразу же (в одну строчку) перенаправляю логику во внутреннюю шаблонную часть.

Ну что же... Бывает, от макросов не уйти... Не зная предметной области, трудно посоветовать что-либо конкретное.

R>

А вот с этим согласен.
... << RSDN@Home 1.1.4 stable rev. 510>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.