Re[6]: Modern C++ Design ParameterType
От: rpz  
Дата: 08.10.12 17:30
Оценка:
Здравствуйте, Кодт, Вы писали:


К>// функции над типами


К>template<class T> struct Id { typedef T type; };


К>template<class T> struct AddStar { typedef T* type; };


К>template<class T> struct RemoveStar { typedef T type; };

К>template<class T> struct RemoveStar<T*> { typedef T type; };

К>template< template<class> class Fun > void Foo()

К>{
К> std::cout << typeid( typename Fun<int***>::type ).name() << std::endl;
К>}

К>int main()

К>{
К> foo(id); foo(succ); foo(pred);
К> Foo<Id>(); Foo<AddStar>(); Foo<RemoveStar>();
К>}
К>[/c]
Это немного не то.. Тут предполагается что мы заранее знаем будущий тип, точнее его модификацию(AddStar или RemoveStar). Такие же штуки есть в новой STL. remove_reference и add_reference. А нужно вывести его автоматически.
К>Во-вторых, мы можем передать в шаблон не сам тип, а его характеристику (traits). И шаблон оттуда извлечёт всё, что ему нужно, в том числе исходный тип.
К>
К>template<class TT> struct Foo
К>{
К>  typedef TT::ParameterType TheType;
К>  .....
К>};
К>

Ну а толку, если мы уже передали переменную и передалась она по значению из-за вывода аргументов шаблона. Тут надо заставить менться тип аргумента принимающей функции.

К>В-третьих, для нескольких разных типов будет одинаковый ParameterType. Особенно Александреску любил находить "наиболее подходящий способ передачи параметров". Для примитивных типов выгоднее передавать их в функцию по значению: foo(int). Для громоздких типов — по константной ссылке: foo(const std::string). Для неконстантных ссылок — как есть: foo(int&).

К>Так что TypeTraits<std::string>::ParameterType может быть const std::string&.
Так идея-то как раз в этом, что по типу передаваемого значения определяется как передавать аргумент. В общем задача такова. Написать что-то типа

int i;
A a;
foo(i);//Вызывается foo(int) **1
foo(a);//Вызывается foo(const A&) **2
ну или хотя бы так
foo(ParameterTraits<int>::ParameterType(i));// **1
foo(ParameterTraits<A>::ParameterType(a));// **2

но не 
foo<const A&>(a) или foo(ParameterTraits<const A&>::ParameterType(a));
//То есть мы не подсказываем компилятору foo<const A&>(a). Это выводится само через шаблон ParameterType<T> (T=A).


Но как я понял из вашего объяснения в таком виде задача нерешаема.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.