Шаблоны могут быть использованы как параметры шаблонов:
Шаблоны могут быть использованы как параметры шаблонов:
Что будет выведено на экран в результате выполнения программы?
#include <iostream>
typedef int*** INT;
template <typename T>
struct S {
enum {result = 2};
};
template<typename T>
struct S<T*> {
enum {result = 1 + S<T>::result};
};
int main() {
std::cout << S<INT>::result;
return 0;
}
Что будет выведено на экран в результате выполнения программы?
#include <iostream>
typedef int*** INT;
template <typename T>
struct S {
enum {result = 2};
};
template<typename T>
struct S<T*> {
enum {result = 1 + S<T>::result};
};
int main() {
std::cout << S<INT>::result;
return 0;
}
Могут ли динамические библиотеки экспортировать шаблонные функции и классы?
1) Все шаблонные классы и функции автоматически экспортируются
2) Экспортироваться могут только специфицированные шаблонные функции и классы
3) Экспортировать шаблоны нельзя - их имплементацию необходимо полностью помещать во включаемых файлах (*.h, *.hpp etc.)
Могут ли динамические библиотеки экспортировать шаблонные функции и классы?
1) Все шаблонные классы и функции автоматически экспортируются
2) Экспортироваться могут только специфицированные шаблонные функции и классы
3) Экспортировать шаблоны нельзя - их имплементацию необходимо полностью помещать во включаемых файлах (*.h, *.hpp etc.)
Шаблонные функции определяют:
Шаблонные функции определяют:
Скомпилируется ли код?
template<typename T> class A{ A(){} }; // 1
template<typename T> struct B{ B(){} }; // 2
template<typename T> union C{ C(){} }; // 3
template<template<typename> class U, typename V>
struct D
{
D()
{
U<V> u;
}
};
int main()
{
D<A, int> a; // 4
D<B, int> b; // 5
D<C, int> c; // 6
}
Скомпилируется ли код?
template<typename T> class A{ A(){} }; // 1
template<typename T> struct B{ B(){} }; // 2
template<typename T> union C{ C(){} }; // 3
template<template<typename> class U, typename V>
struct D
{
D()
{
U<V> u;
}
};
int main()
{
D<A, int> a; // 4
D<B, int> b; // 5
D<C, int> c; // 6
}
Что будет выведено в результате выполнения данной программы:
template<class T, class U>
struct A{
struct dummy{char _[2];};
static char _(T);
static dummy _(...);
static const bool value=sizeof(_(U()))==sizeof(char);
};
struct B{};
struct C:B{};
...
cout << A<B,C>::value << A<B,B>::value << A<C,B>::value;
Что будет выведено в результате выполнения данной программы:
template<class T, class U>
struct A{
struct dummy{char _[2];};
static char _(T);
static dummy _(...);
static const bool value=sizeof(_(U()))==sizeof(char);
};
struct B{};
struct C:B{};
...
cout << A<B,C>::value << A<B,B>::value << A<C,B>::value;
Какими будут значения B::a
и C::a
после выполнения следующего кода?
tеmрlаtе<сlаss Т>
struсt А{
stаtiс int а;
А(){а++;}
};
struсt В : А<В>{};
struсt С : А<С>{};
tеmрlаtе<сlаss Т> int А<Т>::а;
tеmрlаtе<> int А<С>::а=4;
С с1,с2;
В b[10];
Варианты ответов:
1)
В::а
неопределено,
С::а == 5
2)
В::a
неопределено,
С::a == 6
3)
В::а == 9
,
С::а == 5
4)
В::а == 10
,
С::а == 6
Какими будут значения B::a
и C::a
после выполнения следующего кода?
tеmрlаtе<сlаss Т>
struсt А{
stаtiс int а;
А(){а++;}
};
struсt В : А<В>{};
struсt С : А<С>{};
tеmрlаtе<сlаss Т> int А<Т>::а;
tеmрlаtе<> int А<С>::а=4;
С с1,с2;
В b[10];
Варианты ответов:
1)
В::а
неопределено,
С::а == 5
2)
В::a
неопределено,
С::a == 6
3)
В::а == 9
,
С::а == 5
4)
В::а == 10
,
С::а == 6
Имеется шаблонная функция:
template <class T> T max (T a, T b)
{
if a<b return b;
return a;
}
Какая специализация будет создана компилятором при вызове max( 'a' , 3 )?
Имеется шаблонная функция:
template <class T> T max (T a, T b)
{
if a<b return b;
return a;
}
Какая специализация будет создана компилятором при вызове max( 'a' , 3 )?
Какое число будет выведено на экран при выполнении данной программы?
tеmрlаtе<сlаss T> T f(){
stаtiс unsignеd n = 0;
rеturn ++n;
}
...
соut<<f<int>()*100 + f<сhаr>()*10 + f<int>()<<еndl;
Какое число будет выведено на экран при выполнении данной программы?
tеmрlаtе<сlаss T> T f(){
stаtiс unsignеd n = 0;
rеturn ++n;
}
...
соut<<f<int>()*100 + f<сhаr>()*10 + f<int>()<<еndl;
Какие из объявлений шаблонов верны?
1)
template<template<typename> class T> class A{};
2)
template<template<typename> struct T> class A{};
3)
template<template<typename> union T> class A{};
4)
template<template<typename> typename T> class A{};
Какие из объявлений шаблонов верны?
1)
template<template<typename> class T> class A{};
2)
template<template<typename> struct T> class A{};
3)
template<template<typename> union T> class A{};
4)
template<template<typename> typename T> class A{};
Отметьте верные способы специализации функции
tеmрlаtе<сlаss Т> vоid f(Т а, Т b);
для типа bооl
:
1)
tеmрlаtе<> vоid f<>(bооl а,bооl b);
2)
tеmрlаtе<> vоid f(bооl а,bооl b);
3)
tеmрlаtе<> vоid f<bооl>(bооl а,bооl b);
Отметьте верные способы специализации функции
tеmрlаtе<сlаss Т> vоid f(Т а, Т b);
для типа bооl
:
1)
tеmрlаtе<> vоid f<>(bооl а,bооl b);
2)
tеmрlаtе<> vоid f(bооl а,bооl b);
3)
tеmрlаtе<> vоid f<bооl>(bооl а,bооl b);
Какой из приведенных ниже вариантов подходит больше всего?
#include <iostream>
//...
// 1
inline int const& max(int const& a, int const& b)
{
return a < b ? b : a;
}
// 2
template<typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
//...
int main()
{
//...
std::cout << ::max('a', 42.7) << std::endl; //3
//...
return 0;
}
Варианты ответов:
1) В строке //3 будет вызвана перегрузка функции //2.
2) В строке //3 будет вызвана перегрузка функции //1.
3) Чтобы код скомпилировался, в строке //3 необходимо явно указать тип: max<int>(...).
4) Чтобы код скомплировался, в строке //3 необходимо указать пустой тип: max<>(...).
5) Произойдет ошибка компиляции потому, что нету подходящей перегрузки для функции max().
Какой из приведенных ниже вариантов подходит больше всего?
#include <iostream>
//...
// 1
inline int const& max(int const& a, int const& b)
{
return a < b ? b : a;
}
// 2
template<typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
//...
int main()
{
//...
std::cout << ::max('a', 42.7) << std::endl; //3
//...
return 0;
}
Варианты ответов:
1) В строке //3 будет вызвана перегрузка функции //2.
2) В строке //3 будет вызвана перегрузка функции //1.
3) Чтобы код скомпилировался, в строке //3 необходимо явно указать тип: max<int>(...).
4) Чтобы код скомплировался, в строке //3 необходимо указать пустой тип: max<>(...).
5) Произойдет ошибка компиляции потому, что нету подходящей перегрузки для функции max().
Что выведет следующий код?
#include <iostream>
class Rose {};
class A { public: typedef Rose rose; };
template<typename T>
class B: public T { public: typedef typename T::rose foo; };
template<typename T>
void smell(T) { std::cout << "Жуть!" << std::endl; }
void smell(Rose) { std::cout << "Прелесть!" << std::endl; }
int main()
{
smell(A::rose());
smell(B<A>::foo());
return 0;
}
Варианты ответов:
1) Жуть!
Жуть!
2) Прелесть!
Прелесть!
3) Прелесть!
Жуть!
4) Жуть!
Прелесть!
5) Программа не скомпилируется
Что выведет следующий код?
#include <iostream>
class Rose {};
class A { public: typedef Rose rose; };
template<typename T>
class B: public T { public: typedef typename T::rose foo; };
template<typename T>
void smell(T) { std::cout << "Жуть!" << std::endl; }
void smell(Rose) { std::cout << "Прелесть!" << std::endl; }
int main()
{
smell(A::rose());
smell(B<A>::foo());
return 0;
}
Варианты ответов:
1) Жуть!
Жуть!
2) Прелесть!
Прелесть!
3) Прелесть!
Жуть!
4) Жуть!
Прелесть!
5) Программа не скомпилируется
Имеются следующие объявления:
template <class T> class TDB{
T* rp;
int num;
public: TDB(int n) { rp=new T[num=n];}
~TDB() { delete [ ]rp;}
T& GetRec(int rn){
T*crp=rp;
if (0<=rn && rn<num)
while (rn-->0)
crp++;
return *crp;
}
};
class TRec {
private: char name[21];
public: TRec() {name[0]=0;}
TRec(const char * s) { Assign(s);}
void Assign(const char * s) { strncpy(name,s,20);}
char * Get() {return name;}
};
TDB<TRec *> *pdb;
Как добавить в массив pdb одну запись?
Имеются следующие объявления:
template <class T> class TDB{
T* rp;
int num;
public: TDB(int n) { rp=new T[num=n];}
~TDB() { delete [ ]rp;}
T& GetRec(int rn){
T*crp=rp;
if (0<=rn && rn<num)
while (rn-->0)
crp++;
return *crp;
}
};
class TRec {
private: char name[21];
public: TRec() {name[0]=0;}
TRec(const char * s) { Assign(s);}
void Assign(const char * s) { strncpy(name,s,20);}
char * Get() {return name;}
};
TDB<TRec *> *pdb;
Как добавить в массив pdb одну запись?
Параметром шаблона может быть:
1) Любой тип, за исключением локальных и безымянных
2) Значение перечислимого типа
3) Значение любого встроенного типа, за исключением указателей и стороковых констант
4) Любой тип данных, кроме тех у которых конструктор по умолчанию не определён
Параметром шаблона может быть:
1) Любой тип, за исключением локальных и безымянных
2) Значение перечислимого типа
3) Значение любого встроенного типа, за исключением указателей и стороковых констант
4) Любой тип данных, кроме тех у которых конструктор по умолчанию не определён
Отметьте верные утверждения:
1) Вы можете явным образом указывать параметры шаблонов в угловых скобках
2) Для функций могут быть заданы параметры шаблона по умолчанию,используя знак = после объявления параметра шаблона
3) Шаблонные параметры указанные явным образом должны совпадать с типами параметров переданных в функцию
4) Шаблонные функции можно перегружать
Отметьте верные утверждения:
1) Вы можете явным образом указывать параметры шаблонов в угловых скобках
2) Для функций могут быть заданы параметры шаблона по умолчанию,используя знак = после объявления параметра шаблона
3) Шаблонные параметры указанные явным образом должны совпадать с типами параметров переданных в функцию
4) Шаблонные функции можно перегружать
Содержит ли следующий код ошибки (компиляции, выполнения, линковки, UB)?
template <int T> void f();
template <> void f<0>() {}
void Test() {
f<1>();
}
Содержит ли следующий код ошибки (компиляции, выполнения, линковки, UB)?
template <int T> void f();
template <> void f<0>() {}
void Test() {
f<1>();
}
Что будет выведено на экран?
#include <iostream>
#include <string>
template<int T>
std::string StrangeFunc()
{
return StrangeFuncStruct<T>::value();
}
template<int T, bool lt16 = (T<16)>
struct StrangeFuncStruct
{
static std::string value()
{
return StrangeFuncStruct<T, (T<16)>::value();
}
};
template<int T>
struct StrangeFuncStruct<T, true>
{
static std::string value()
{
return std::string(1, T + ((T>9)?'A'-10:'0'));
}
};
template<int T>
struct StrangeFuncStruct<T, false>
{
static std::string value()
{
return StrangeFuncStruct<(T/16)>::value()
+ StrangeFuncStruct<(T%16)>::value();
}
};
int main()
{
std::cout << StrangeFunc<137+137*256>() << std::endl;
}
Что будет выведено на экран?
#include <iostream>
#include <string>
template<int T>
std::string StrangeFunc()
{
return StrangeFuncStruct<T>::value();
}
template<int T, bool lt16 = (T<16)>
struct StrangeFuncStruct
{
static std::string value()
{
return StrangeFuncStruct<T, (T<16)>::value();
}
};
template<int T>
struct StrangeFuncStruct<T, true>
{
static std::string value()
{
return std::string(1, T + ((T>9)?'A'-10:'0'));
}
};
template<int T>
struct StrangeFuncStruct<T, false>
{
static std::string value()
{
return StrangeFuncStruct<(T/16)>::value()
+ StrangeFuncStruct<(T%16)>::value();
}
};
int main()
{
std::cout << StrangeFunc<137+137*256>() << std::endl;
}
Какой из вариантов кода не содержит ошибки?
1)
typedef int Type;
template <class Type>
class Class {
...
public:
Type val;
}
2)
template <class Type>
class Class {
...
public:
typedef int Type;
Type val;
}
3)
Оба варианта не верны
Какой из вариантов кода не содержит ошибки?
1)
typedef int Type;
template <class Type>
class Class {
...
public:
Type val;
}
2)
template <class Type>
class Class {
...
public:
typedef int Type;
Type val;
}
3)
Оба варианта не верны
Каким будет результат выполнения следующего кода?
#include <iostream>
struct A {
virtual int f(int) {
return 1;
}
};
struct B : A {
template <typename T>
int f(T) {
return 2;
}
};
int main(int argc, char**argv) {
A* pa = new B;
std::cout << pa->f(1) << '\n';
delete pa;
return 0;
}
Каким будет результат выполнения следующего кода?
#include <iostream>
struct A {
virtual int f(int) {
return 1;
}
};
struct B : A {
template <typename T>
int f(T) {
return 2;
}
};
int main(int argc, char**argv) {
A* pa = new B;
std::cout << pa->f(1) << '\n';
delete pa;
return 0;
}