специализация неспециализированным шаблоном
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.12.13 03:56
Оценка:
приветствую!

что-то не так делаю, и нефкурю, что...

задача в том, что нужно определить тип шаблона, передаваемый другому шаблону.

#include <type_traits>

/***************************************************************************/
// библиотечный код

namespace std {
// форварды, ибо сюда нельзя инклюдить <fstream>
template<typename C, typename T>
class basic_ifstream;

template<typename C, typename T>
class basic_ofstream;

} // ns std

template<template<typename C, typename T> class IO>
struct ios_type;

template<template<typename C, typename T> class IO>
struct ios_type<std::basic_ifstream<C, T>>: std::integral_constant<int, 1> {
};
template<template<typename C, typename T> class IO>
struct ios_type<std::basic_ofstream<C, T>>: std::integral_constant<int, 2> {
};

/***************************************************************************/

// пользовательский код

#include <iostream>

int main() {
    std::cout << ios_type<std::ifstream>::value << std::endl;
    std::cout << ios_type<std::ofstream>::value << std::endl;
}

компилятор говорит:

$ g++ -std=c++11 templspec.cpp -otemplspec
templspec.cpp:21:37: error: 'C' was not declared in this scope
struct ios_type<std::basic_ifstream<C, T>>: std::integral_constant<int, 1> {
^
templspec.cpp:21:40: error: 'T' was not declared in this scope
struct ios_type<std::basic_ifstream<C, T>>: std::integral_constant<int, 1> {
^
templspec.cpp:21:40: error: template argument 1 is invalid
templspec.cpp:21:40: error: template argument 2 is invalid
templspec.cpp:21:41: error: template argument 1 is invalid
struct ios_type<std::basic_ifstream<C, T>>: std::integral_constant<int, 1> {
^
templspec.cpp:24:37: error: 'C' was not declared in this scope
struct ios_type<std::basic_ofstream<C, T>>: std::integral_constant<int, 2> {
^
templspec.cpp:24:40: error: 'T' was not declared in this scope
struct ios_type<std::basic_ofstream<C, T>>: std::integral_constant<int, 2> {
^
templspec.cpp:24:40: error: template argument 1 is invalid
templspec.cpp:24:40: error: template argument 2 is invalid
templspec.cpp:24:41: error: template argument 1 is invalid
struct ios_type<std::basic_ofstream<C, T>>: std::integral_constant<int, 2> {
^
templspec.cpp: In function 'int main()':
templspec.cpp:34:37: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class C, class T> class IO> struct ios_type'
std::cout << ios_type<std::ifstream>::value << std::endl;
^
templspec.cpp:34:37: error: expected a class template, got 'std::ifstream {aka std::basic_ifstream<char>}'
templspec.cpp:35:37: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class C, class T> class IO> struct ios_type'
std::cout << ios_type<std::ofstream>::value << std::endl;
^
templspec.cpp:35:37: error: expected a class template, got 'std::ofstream {aka std::basic_ofstream<char>}'


ЧЯДНТ?

благодарен.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: специализация неспециализированным шаблоном
От: jazzer Россия Skype: enerjazzer
Дата: 19.12.13 04:07
Оценка: +1
Здравствуйте, niXman, Вы писали:

X>
X>namespace std {
X>// форварды, ибо сюда нельзя инклюдить <fstream>
X>template<typename C, typename T>
X>class basic_ifstream;
X>


(Дальше не читал) Открой для себя <iosfwd>
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: специализация неспециализированным шаблоном
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.12.13 04:09
Оценка:
да, спасибо!
а по существу, есть что сказать?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: специализация неспециализированным шаблоном
От: jazzer Россия Skype: enerjazzer
Дата: 19.12.13 04:42
Оценка: 3 (1) +1
Здравствуйте, niXman, Вы писали:

X>да, спасибо!

X>а по существу, есть что сказать?

template<class IO>
struct ios_type;

template<typename C, typename T>
struct ios_type<std::basic_ifstream<C,T>>: std::integral_constant<int, 1> {
};
template<typename C, typename T>
struct ios_type<std::basic_ofstream<C,T>>: std::integral_constant<int, 2> {
};
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: специализация неспециализированным шаблоном
От: Кодт Россия  
Дата: 19.12.13 07:03
Оценка: 15 (1) +1
Здравствуйте, niXman, Вы писали:

Вкратце,
// пусть у нас есть вот такие шаблоны - фактические аргументы нижележащих
template<class FP1, class FP2, class FP3> class foo1;
template<class FP1, class FP2 = int, class FP3 = char> class foo2;
template<class FP1> class foo3;

// параметр - шаблон вида <*,*,*>
template<template<class,class,class> class FooTemplate, class BP2, class BP3> class bar;
template<class BP2, class BP3> class bar<foo1, BP2, BP3> {};
template<class BP2, class BP3> class bar<foo2, BP2, BP3> {};
template<class BP2, class BP3> class bar<foo3, BP2, BP3> {}; // ошибка

// напротив, шаблон вида <*>
template<template<class> class FooTemplate, class BP2, class BP3> class buz;
template<class BP2, class BP3> class buz<foo1, BP2, BP3> {}; // ошибка
template<class BP2, class BP3> class buz<foo2, BP2, BP3> {}; // ошибка
template<class BP2, class BP3> class buz<foo3, BP2, BP3> {};

// нешаблонный параметр, проброс его параметров
template<class FooInstance, class XP2, class XP3> class xyz;
template<class FP1, class FP2, class FP3, class XP2, class XP3> class xyz<foo1<FP1,FP2,FP3>, XP2, XP3> {};
template<class FP1, class FP2,            class XP2, class XP3> class xyz<foo2<FP1,FP2>,     XP2, XP3> {};
template<class FP1                        class XP2, class XP3> class xyz<foo3<FP1>,         XP2, XP3> {};

Отсюда мораль: шаблонные параметры — если не зло, то, как минимум, морока.
Перекуём баги на фичи!
Re[2]: специализация неспециализированным шаблоном
От: jazzer Россия Skype: enerjazzer
Дата: 19.12.13 07:09
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Отсюда мораль: шаблонные параметры — если не зло, то, как минимум, морока.

И ему они и не нужны вдобавок
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: специализация неспециализированным шаблоном
От: jazzer Россия Skype: enerjazzer
Дата: 27.12.13 07:32
Оценка:
Здравствуйте, niXman, Вы писали:

X>да, спасибо!

X>а по существу, есть что сказать?

не понял я твоего "согласен", если честно
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: специализация неспециализированным шаблоном
От: Lazin Россия http://evgeny-lazin.blogspot.com
Дата: 27.12.13 11:18
Оценка: +2
Здравствуйте, jazzer, Вы писали:

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


X>>да, спасибо!

X>>а по существу, есть что сказать?

J>
J>template<class IO>
J>struct ios_type;

J>template<typename C, typename T>
J>struct ios_type<std::basic_ifstream<C,T>>: std::integral_constant<int, 1> {
J>};
J>template<typename C, typename T>
J>struct ios_type<std::basic_ofstream<C,T>>: std::integral_constant<int, 2> {
J>};
J>


Вот так вот выглядит методология разработки forum driven development
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.