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

C++ 如何专门化任何类型的模板以允许可变长度数组,c++,templates,template-specialization,specialization,C++,Templates,Template Specialization,Specialization,甚至不知道这种情况的正确术语是什么。如果我知道的话,我可能会找到答案 我有一个模板化的函数 template<typename T> void write(Buffer& b, const T& value); 这个错误对我来说是有道理的。但我不明白的是如何为这个声明专门化。我希望这样一个专门化所要做的就是将char[]参数强制转换为(const char*),并调用现有的专门化。但我不知道该怎么做 对于具体的例子,我可以这样做 template<size_t

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

我有一个模板化的函数

template<typename T> void write(Buffer& b, const T& value);
这个错误对我来说是有道理的。但我不明白的是如何为这个声明专门化。我希望这样一个专门化所要做的就是将
char[]
参数强制转换为
(const char*)
,并调用现有的专门化。但我不知道该怎么做

对于具体的例子,我可以这样做

template<size_t N> void write<char[6]>(Buffer& b, char const (&value) [6])
模板无效写入(缓冲区和b、字符常量和值)[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])
模板无效写入(缓冲区和对象、字符常量和值)[N])
模板无效写入(缓冲区和对象、字符常量和值)[N])
模板无效写入(缓冲区和对象、字符常量和值)[N])
模板无效写入(缓冲区和对象、字符常量和值)[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);
}

。。。但是可以通过部分专门化
结构来模拟它。

不能对模板函数进行部分专门化。有关如何对模板化类中的函数执行一定级别的间接寻址以绕过此限制,请参见

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

void write(Buffer &b), const char *v)
{
    write<const char *>(b, v);
}
无效写入(缓冲区和b),常量字符*v)
{
写(b,v);
}

这有效地隐藏了在内联函数中与模板函数一起使用的强制转换。

@SnoopyLane-这回答了问题吗?很抱歉回答得太晚。很多分心的事情。事实上,这确实解释了这个问题,而非模板版本正是我最终得到的。非模板是我最初想要的,但我在一些元编程中分心了,认为我需要模板。我粘贴在顶部的片段简化了这一点。谢谢。很抱歉很晚才回复。那么你所说的“通过部分专门化结构来模拟”是什么意思呢?有一个例子的链接吗?我的意思是,将函数包装成一个部分专用的
结构,即
模板结构帮助器;模板结构帮助器{静态无效写入(缓冲区和对象、字符常量和值)[N]);}
void write(Buffer& ob, char const* value) {
    write<char const*>(ob, value);
}
template <int N>
void write<char const[N]>(Buffer& ob, char const (&value)[N]); // ERROR
void write(Buffer &b), const char *v)
{
    write<const char *>(b, v);
}