C++: сохранить константность параметра шаблона шаблонаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C++: сохранить константность параметра шаблона шаблона

Сообщение Anonymous »

Параметр ссылочного шаблона считается константным или неконстантным в зависимости от аргумента. Параметр шаблона ссылочного шаблона всегда оказывается неконстантным. Есть ли способ это исправить?

Код: Выделить всё

#include 
#include 
#include 
#include 

template
void ref_visit(T& t, const Visitor& visit) { visit(t); }

template
void template_ref_visit(C& c, Visitor visit) { visit(c[0]); }

struct Printer {
void operator()(int& i) const { std::println("non-const: {}", i); }
void operator()(const int& i) const { std::println("const: {}", i); }
} printer;

int main()
{
int i{1};
int& ri{i};
const int& cri{i};
ref_visit(ri, printer); // prints "non-const: 1"
ref_visit(cri, printer); // prints "const: 1"

std::vector v{42};
std::vector& rv{v};
const std::vector& crv{v};
template_ref_visit(rv, printer); // prints "non-const: 42"
template_ref_visit(crv, printer); // FAILS TO COMPILE
}
Вывод компилятора:

Код: Выделить всё

template_template_const.cpp: In function ‘int main()’:
template_template_const.cpp:29:24: error: binding reference of type ‘std::vector&’ to ‘const std::vector’ discards qualifiers
29 |     template_ref_visit(crv, printer); // FAILS TO COMPILE
|                        ^~~
template_template_const.cpp:10:31: note:   initializing argument 1 of ‘void template_ref_visit(C&, Visitor) [with C = std::vector; T = int; Visitor = Printer]’
10 | void template_ref_visit(C& c, Visitor visit) { visit(c[0]); }
|
Добавление перегрузки

Код: Выделить всё

template
void template_ref_visit(const C& c, Visitor visit) { visit(c[0]); }
приводит к дублированию кода. Можно ли этого избежать?


Подробнее здесь: https://stackoverflow.com/questions/791 ... -parameter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»