Шаблоны с параметрами const не отправляются должным образом - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь распределить свои звонки в 2 разных функциях.Один для указателей , а другой для ссылок .Но как только я использую квалификатор const , шаблоны не отправляются должным образом.В моем случае get_pixel не использует спецификатор const , потому что он должен редактировать данный параметр.И set_pixel должен использовать данный параметр, но не редактировать его, и я хотел бы, чтобы эти параметры остались const .

#include <iostream>

template <typename Color>
inline int get_pixel(
    Color&  color)
{
    return 1;
}

template <typename T>
inline int get_pixel(
    T components[])
{
    return 2;
}

template <typename Color>
inline int set_pixel(
    const Color&    color)
{
    return 1;
}

template <typename T>
inline int set_pixel(
    const T components[])
{
    return 2;
}

template <typename Color>
inline int set_pixel_no_const(
    Color&  color)
{
    return 1;
}

template <typename T>
inline int set_pixel_no_const(
    T components[])
{
    return 2;
}


int main()
{

    float c;
    float tab[1];

    std::cout << "Get PIXEL\n";
    std::cout << "Dispatch for c : " << get_pixel(c) << "\n"; // 1
    std::cout << "Dispatch for &c : " << get_pixel(&c) << "\n"; // 2
    std::cout << "Dispatch for tab : " << get_pixel(tab) << "\n"; // 2

    std::cout << "Set PIXEL\n";
    std::cout << "Dispatch for c : " << set_pixel(c) << "\n"; // 1
    std::cout << "Dispatch for &c : " << set_pixel(&c) << "\n"; // 1, Should be 2
    std::cout << "Dispatch for tab : " << set_pixel(tab) << "\n"; // 1, Should be 2

    std::cout << "Set PIXEL NO CONST\n";
    std::cout << "Dispatch for c : " << set_pixel_no_const(c) << "\n"; // 1
    std::cout << "Dispatch for &c : " << set_pixel_no_const(&c) << "\n"; // 2
    std::cout << "Dispatch for tab : " << set_pixel_no_const(tab) << "\n"; // 2

    return 0;
}

Любая идея, почему const квалификатор здесь проблема?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Я могу ошибаться, но я думаю, что в основном этот вопрос сводится к следующему:

#include <iostream>

template <typename T>
int f(T const &)
{
    //std::cout << __PRETTY_FUNCTION__ << "\n";
    return 1;
}

template <typename T>
int f(T const *)
{
    //std::cout << __PRETTY_FUNCTION__ << "\n";
    return 2;
}

int main()
{
    float c = 1.f;
    float * addr = &c;
    float const * addr_const = &c;
    f(c); // 1
    f(&c); // 1 you expected 2
    f(addr); // 1 you expected 2
    f(addr_const); // 2 as you expect
    return 0;
}

Ваш параметр функции массива const такой же, как параметр указателя const в объявлении функции (поэтому я положил еготаким образом в примере).

Я думаю, что первая функция является базовым шаблоном, а вторая версия является более специализированной версией (поскольку для const T требуются только указатели).Таким образом, ссылка const выбирается, когда вы передаете указатель на non const.За исключением случая, когда вы действительно передаете ему указатель на const в качестве аргумента.

Если вы используете gcc (я думаю), вы можете использовать __PRETTY_FUNCTION__ для отображения выведенных аргументов

0 голосов
/ 12 июня 2018

Вычитание шаблона не работает как подстановка текста, но для T в целом.

Когда T in const T выводится как float*, вы не получаетеconst float*, но float* const.

или const (float*), если бы у нас был такой синтаксис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...