powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как явно специализировать шаблонный конструктор?
20 сообщений из 20, страница 1 из 1
Как явно специализировать шаблонный конструктор?
    #38109769
Как явно специализировать шаблонный конструктор?
Что-то вроде этого, но рабочее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
struct T {
    int a;
    template<int _a>
    T() : a(_a) {}
};

int main() {
    T q<5>();
    
    return 0;
}
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38109787
Точнее не специализировать, а явно вызвать с шаблонным параметром.
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38109815
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
специализировать шаблонный конст,

Явно специализировать можно так:
Код: plaintext
1.
template T::T<5>();


Только это должно быть за пределами функций, там, где разрешено объявлять тело метода.

Но что-то мне подсказывает, что вы имели в виду не "явно специализировать", а "явно инстанцировать".
В этом случае ответ: конструктор нельзя явно инстанцировать, можно только неявно, через выведение типов из аргументов.
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38109837
Anatoly Moskovskyспециализировать шаблонный конст,

Явно специализировать можно так:
Код: plaintext
1.
template T::T<5>();


Только это должно быть за пределами функций, там, где разрешено объявлять тело метода.

Но что-то мне подсказывает, что вы имели в виду не "явно специализировать", а "явно инстанцировать".
В этом случае ответ: конструктор нельзя явно инстанцировать, можно только неявно, через выведение типов из аргументов.
Да, хотел явно инстанцировать.
С выведением типов-параметров шаблонов все понятно, а бывает выведение значений-параметров шаблонов (template<int _a>) и как это выглядит?
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38109865
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстанцироватьа бывает выведение значений-параметров шаблонов (template<int _a>) и как это выглядит?
Например вывести из размера массива:
Код: plaintext
1.
2.
3.
4.
5.
6.
template <size_t N> size_t array_size(const char (&s)[N])
{
    return N;
}
...
cout << array_size("123") // 4



вместо size_t можно и int, т.к. размер массива неявно кастится к int.
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38109867
Anatoly Moskovskyинстанцироватьа бывает выведение значений-параметров шаблонов (template<int _a>) и как это выглядит?
Например вывести из размера массива:
Код: plaintext
1.
2.
3.
4.
5.
6.
template <size_t N> size_t array_size(const char (&s)[N])
{
    return N;
}
...
cout << array_size("123") // 4



вместо size_t можно и int, т.к. размер массива неявно кастится к int.
Ясно. А других вариантов нет?
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38109874
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстанцироватьА других вариантов нет?
Почему же. Выводить можно из любых типов, где значение является параметром шаблона или размером массива.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
template <int N> struct S {};

template <int N> int f(S<N> s)
{
    return N;
}

cout << f( S<5>() ); // 5 
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38109995
Anatoly MoskovskyинстанцироватьА других вариантов нет?
Почему же. Выводить можно из любых типов, где значение является параметром шаблона или размером массива.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
template <int N> struct S {};

template <int N> int f(S<N> )
{
    return N;
}

cout << f( S<5>() ); // 5 


А может есть подобная пустая структура в std/boost, допустим имя которой явно говорит о том, что она передается исключительно для явного инстанцирования?
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38110025
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстанцироватьА может есть подобная пустая структура в std/boost, допустим имя которой явно говорит о том, что она передается исключительно для явного инстанцирования?
Это никому не надо просто.
Шаблонные конструкторы нужны только для выведения типов.
Если вам надо явное инстанцирование, используйте шаблон класса, а не конструктора
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38110071
Anatoly MoskovskyинстанцироватьА может есть подобная пустая структура в std/boost, допустим имя которой явно говорит о том, что она передается исключительно для явного инстанцирования?
Это никому не надо просто.
Шаблонные конструкторы нужны только для выведения типов.
Если вам надо явное инстанцирование, используйте шаблон класса, а не конструктора
Допустим нужен обязательно template <int N>, т.к. N - всегда constexpr.
Если я буду делать шаблон класса, то для работы с разными специализациями, как с одним классом нужен будет полиморфизм.
А если делать через шаблон конструктора, то это всегда один класс.
Собственно вопрос что из этого менее громоздко, полиморфизм или такое инстанцирование?
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38110190
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстанцировать,

Вы так спрашиваете как будто у вас есть выбор :)
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38110194
Anatoly Moskovskyинстанцировать,

Вы так спрашиваете как будто у вас есть выбор :)
Не понял намека :)
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38110197
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстанцировать,

Какие намеки. Мы ж только что выяснили что явно инстанцировать конструктор не получится.
Значит остается инстанцирование класса и полиморфизм для работы со всеми возможными инстанцированными классами из одного кода.

Хотя во многих случаях динамический полиморфизм вполне можно заменить на шаблонный. Т.е. там где вы в методе могли бы принимать параметром ссылку на базовый класс, вместо этого сделать метод шаблонным с выведением типа из фактического параметра.
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38110932
Anatoly Moskovskyинстанцировать,

Какие намеки. Мы ж только что выяснили что явно инстанцировать конструктор не получится.
Значит остается инстанцирование класса и полиморфизм для работы со всеми возможными инстанцированными классами из одного кода.

Хотя во многих случаях динамический полиморфизм вполне можно заменить на шаблонный. Т.е. там где вы в методе могли бы принимать параметром ссылку на базовый класс, вместо этого сделать метод шаблонным с выведением типа из фактического параметра.
Так вы же показали, что можно вот так явно инстанцировать конструтор:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <iostream>
using namespace std;

template<size_t N>
struct inst {};

struct T {
    const size_t n;
    
    template<size_t N>
    T(inst<N>) : n(N) {
        if(N >= 10) cout << ">= 10" << endl;
        else cout << "< 10" << endl;
        // ... ещё десятки вызовов if, switch/case, #pragma unroll for, func<N>() и т.д., которые отработают compile-time
        cout << func<N>() << endl;;
    }
    
    template<size_t N>
    constexpr static int func() { /* ... */ return N; }
};

int main() {
    T t(inst<5>());
//    cout << "n = " << t.n << endl;
    
    return 0;
}


Но
1. почему то ничего не выводится на экран
2. если раскоментировать последнюю строчку, то возникает ошибка компиляции:
автор24:25: error: request for member 'n' in 't', which is of non-class type 'T(inst<5u> (*)())'
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38111050
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстанцироватьТак вы же показали, что можно вот так явно инстанцировать конструтор:
Код: plaintext
1.
    T t(inst<5>());



Я уже сам запутался.
Это не явное, а неявное инстанцирование.
Явное делается через указание template (без <>) и инстанцированного прототипа шаблонной функции / инстанцированной декларации шаблонного класса.

То что я выше назвал явной специализацией - это на самом деле явное инстанцирование:
Код: plaintext
1.
2.
3.
4.
template T::T<5>(); // явное инстанцирование функции явным указанием параметров
template class vector<int>; // явное инстанцирование класса с явным указанием параметров
template void sort(char* begin, char* end); // явное инстанцирование функции с выведением параметров 
// предполагаем шаблон template <class Iter> void sort(Iter begin, Iter end);



А неявное инстанцирование - это инстанцирование по месту использования шаблона.
Код: plaintext
1.
2.
vector<int> a; // неявное инстанцирование с явным указанием параметров
sort(v.begin(), v.end()); // неявное инстанцирование с выведением параметров



Специализация же не бывает явной или неявной, а бывает просто специализация, и делается через указание template (с <>) и тела шаблона.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// шаблон
template <class Iter> void sort(Iter begin, Iter end);
// специализация с выведением типов
template<> void sort(char* begin, char* end)
{
  // альтернативная реализация
}
// специализация с явным указанием типов
template<> void sort<char*>(char* begin, char* end)
{
  // альтернативная реализация
}




По поводу ошибки - сорри нет времени разбираться.
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38111114
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, с ошибкой все просто :)

T t(inst<5>()) - это видимо расценивается компилятором не как создание экземпляра T, а декларация прототипа функции f возвращающей T и принимающей указатель на функцию без аргументов возвращающую inst<5>.
Объявите значение передаваемое в конструктор отдельной переменнной.
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38111129
Anatoly MoskovskyА, с ошибкой все просто :)

T t(inst<5>()) - это видимо расценивается компилятором не как создание экземпляра T, а декларация прототипа функции f возвращающей T и принимающей указатель на функцию без аргументов возвращающую inst<5>.
Объявите значение передаваемое в конструктор отдельной переменнной.
Как хитро все закручено :)

Да, так работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
#include <iostream>
using namespace std;

template<size_t N>
struct T_inst {};

struct T {
    const size_t n;
    
    template<size_t N>
    T(T_inst<N>) : n(N) {
        if(N >= 10) cout << ">= 10" << endl;
        else cout << "< 10" << endl;
        // ... ещё десятки вызовов if, switch/case, #pragma unroll for, func<N>() и т.д., которые отработают compile-time
        cout << func<N>() << endl;;
    }
    
    template<size_t N>
    constexpr static int func() { /* ... */ return N; }
};

int main() {
    T_inst<5> inst;
    T t(inst);
    cout << "n = " << t.n << endl;
    
    return 0;
}
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38111419
Anatoly MoskovskyСпециализация же не бывает явной или неявной, а бывает просто специализация, и делается через указание template (с <>) и тела шаблона.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// шаблон
template <class Iter> void sort(Iter begin, Iter end);
// специализация с выведением типов
template<> void sort(char* begin, char* end)
{
  // альтернативная реализация
}
// специализация с явным указанием типов
template<> void sort<char*>(char* begin, char* end)
{
  // альтернативная реализация
}



А почему не проходит такая специализация и инстанцирование при передаче шаблонного класса в параметр шаблона?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>
#include <vector>
using namespace std;

template<template<typename> class T>
T<int> func() {
    T<int> t;
    return t;
}

//template<> 
//vector<int> func(); // специализация тоже не проходит

int main() {
    vector<int> a = func<vector>();

    return 0;
}


автор16:34: error: no matching function for call to 'func()'
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38111483
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстанцировать,

Скорее всего потому что std::vector не соответствует декларации template<typename> class T.
Насколько я помню там не один параметр, а несколько (как минимум аллокатор еще)
...
Рейтинг: 0 / 0
Как явно специализировать шаблонный конструктор?
    #38111528
Anatoly Moskovskyинстанцировать,

Скорее всего потому что std::vector не соответствует декларации template<typename> class T.
Насколько я помню там не один параметр, а несколько (как минимум аллокатор еще)
Да.
http://www.cplusplus.com/reference/vector/vector/] http://www.cplusplus.com/reference/vector/vector/
авторtemplate < class T, class Alloc = allocator<T> > class vector; // generic template
Вариадические шаблоны спасают, работает :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>
#include <vector>
using namespace std;

template<template<typename ...> class T>
T<int> func() {
    T<int> t;
    return t;
}

//template<> 
//vector<int> func(); // специализация тоже не проходит

int main() {
    vector<int> a = func<vector>();

    return 0;
}



Иначе нужен такой финт ушами, обязательно точно количество параметров и обязательно самому аллокатор указывать чтоб работало:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>
#include <vector>
using namespace std;

template<template<typename, typename> class T>
T<int, allocator<int>> func() {
    T<int, allocator<int>> t;
    return t;
}

//template<> 
//vector<int> func(); // специализация тоже не проходит

int main() {
    vector<int> a = func<vector>();

    return 0;
}
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как явно специализировать шаблонный конструктор?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]