带有const参数的模板不会按预期发送

时间:2018-06-12 09:15:53

标签: c++ templates pointers const

我正在尝试用两种不同的功能调度我的电话。一个用于指针,另一个用于引用。但是一旦我使用 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 :(得分:3)

模板推断不能用作文本​​替换,而是作为整体T

T中的const T被推断为float*时,您不会获得const float*,而是float* const

const (float*),如果我们有这样的语法。

答案 1 :(得分:2)

我可能错了,但我认为基本上这个问题归结为:

#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时,会选择const引用。除非在这种情况下你真的传递了一个指向const作为参数的指针。

如果您使用gcc(我认为),您可以使用__PRETTY_FUNCTION__来显示推断出的参数