специализация неспециализированным шаблоном
приветствую!
что-то не так делаю, и нефкурю, что...
задача в том, что нужно определить тип шаблона, передаваемый другому шаблону.
#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>
Re[2]: специализация неспециализированным шаблоном
да, спасибо!
а по существу, есть что сказать?
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[3]: специализация неспециализированным шаблоном
Здравствуйте, 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> {
};
Re: специализация неспециализированным шаблоном
Здравствуйте, 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
Оценка:
Здравствуйте, Кодт, Вы писали:
К>Отсюда мораль: шаблонные параметры — если не зло, то, как минимум, морока.
И ему они и не нужны вдобавок
Re[3]: специализация неспециализированным шаблоном
От:
jazzer
Skype: enerjazzer
Дата: 27.12.13 07:32
Оценка:
Здравствуйте, niXman, Вы писали:
X>да, спасибо!
X>а по существу, есть что сказать?
не понял я твоего "согласен", если честно
Re[4]: специализация неспециализированным шаблоном
Здравствуйте, 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
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить