gpt4 book ai didi

c++ - 如何专门化采用任何类型的模板以允许可变长度数组

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:37 25 4
gpt4 key购买 nike

甚至不确定这种情况的正确术语是什么。如果我知道,那么我可能会找到答案。

我有一个看起来像这样的模板化函数

template<typename T> void write(Buffer& b, const T& value);

没有这个的通用实现,只有明确的特化。例如

template<> void write<int>(Buffer& b, const int& value) { ... }
template<> void write<const char *>(Buffer& b, const char * const & value) { ... }

到目前为止一切顺利。但是当然,当我调用 write(buffer, "hello") 时,我收到一个链接错误提示

undefined reference to `void write<char [6]>(Buffer&, char const (&) [6])'

这个错误对我来说很有意义。但是我不知道的是如何为此声明特化。我想要这样一个特化做的就是将 char[] 参数转换为 (const char*) 并调用现有的特化。但我不知道该怎么做。

具体的例子我可以做

template<size_t N> void write<char[6]>(Buffer& b, char const (&value) [6])

但是为每个可能的长度字符串常量定义其中之一显然是 Not Acceptable 。但是我尝试了以下方法,其中一些只是捕获救命稻草,但没有一个起作用。

template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N])
template<size_t N> template<> void write<char const[N]>(Buffer& ob, char const (&value) [N])
template<> template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N])
template<template<size_t N>> void write<char const[N]>(Buffer& ob, char const (&value) [N])

正确的咒语是什么?我正在使用 GCC 4.7.3 x86_64。

最佳答案

如果可以,在使用字符数组调用 write() 函数时不指定参数类型(或者在这些情况下使用 char const*比,例如 char[6]),实现这个的方法是使用重载来处理 char const*:

void write(Buffer& ob, char const* value) {
write<char const*>(ob, value);
}

此函数优于模板实例化,因此可用于适本地委托(delegate)对字符串文字(实际上通常是 C 字符串)的处理。

如果需要传递正确的类型,唯一可行的方法是不特化实际的函数模板,而是立即委托(delegate)一个具有合适成员函数的 struct 和部分特化此 struct 以处理数组:您不能部分特化函数模板,即以下是非法的:

template <int N>
void write<char const[N]>(Buffer& ob, char const (&value)[N]); // ERROR

... 但它可以通过部分特化 struct 来模拟。

关于c++ - 如何专门化采用任何类型的模板以允许可变长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18436616/

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