gpt4 book ai didi

c++ - 引用 const 的模板特化

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:16 25 4
gpt4 key购买 nike

我正在尝试了解模板特化的工作原理。我有以下功能模板:

template <typename T>
void function(const T &t1, const T &t2)
{
std::cout << "in function template: " << t1 << ", " << t2 << std::endl;
}

现在,我想特化这个函数模板,以防它被指向 const 的指针调用:

// template specialization
template <>
void function(const char *&t1, const char *&t2)
{
std::cout << "in compare template specialization: " << t1 << ", " << t2 << std::endl;
}

但是编译器提示说它找不到专门化的函数模板:

In file included from main.cpp:1:0:
template.h:23:5: error: template-id 'compare<>' for 'int compare(const char*&, const char*&)' does not match any template declaration
int compare(const char *&t1, const char *&t2)
^~~~~~~
template.h:10:5: note: candidate is: template<class T> int compare(const T&, const T&)
int compare(const T &t1, const T &t2)

如果我像这样专门化模板(对指向 const 的 CONST 指针的引用),它会起作用:

// template specialization
template <>
int compare(const char * const &t1, const char * const &t2) // now the pointer itself is const
{
std::cout << "in compare template specialization: " << t1 << ", " << t2 << std::endl;
}

我想用 const char *Ptr = "hello world" 调用函数,所以我认为推断的参数 T 是 char* 而参数是 const char *&。

函数模板参数列表中的const不都是低级const吗?

最佳答案

模板不是像宏那样简单的标记替换机制。这里的 const T 并不意味着“将 T 粘贴到 const 之后的位置”。这意味着那里的东西的类型是“const 无论 T 是什么”。在函数模板的情况下,如果将 T 设置为 const char*,则类型 const T& 将是对 const 的引用,无论 T 是什么,即对 const char* 的引用本身是 const,a 6.715,即 6.715这与 const char * const & 是类型定义的名称而不是模板参数没有什么不同,例如:

using T = int*;
const T blub = 42; // type of blub is int* const, not const int*

因此,

template <>
void function(const char*& t1, const char*& t2);

不是函数模板 T 的有效特化。没有 function 可以替换到模板 T 中以获得此签名。如果将参数 function 替换为 const char* ,即形式 T ,其签名将变为

void function<const char*>(const char * const& t1, const char * const& t2);

请注意,如果您想要一个单独的函数来处理

void function(const char*& t1, const char*& t2);

情况下,只需添加这样一个函数并依靠重载来发挥其魔力。通常,当您发现自己正在编写显式函数模板特化时,很可能您真正想要做的可能只是使用重载。另请参阅 Template Specialization VS Function Overloadingthis article(旧的,但仍然和以前一样真实)以了解更多信息......

关于c++ - 引用 const 的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55636728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com