2

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

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

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])

但是为每个可能的长度字符串常量定义其中一个显然是不可接受的。但是我尝试了以下方法,其中一些只是抓住稻草,但都没有奏效。

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。

4

2 回答 2

1

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

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

此函数优于模板实例化,因此可用于适当地委派字符串文字(实际上是一般的 C 字符串)的处理。

如果需要传递正确的类型,唯一可行的方法是不专门化实际的函数模板,而是立即struct用合适的成员函数委托 a 并部分专门化它struct来处理数组:你不能部分特化函数模板,即以下是非法的:

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

...但它可以通过部分专门化 astruct来模拟。

于 2013-08-26T04:40:48.590 回答
0

您不能对模板函数进行部分特化。请参阅此说明,了解如何对模板类中的函数进行一定程度的间接处理,以绕过此限制。

在这个简单的情况下,您还可以使用调用模板的非write模板:

void write(Buffer &b), const char *v)
{
    write<const char *>(b, v);
}

这有效地隐藏了在内联函数中与模板函数一起使用的演员表。

于 2013-08-26T05:07:55.437 回答