我希望能够基于常量c样式字符串进行专门化。问题是,当我调用我的模板化函数时,类型是const char [N],其中'N'是字符串+1(空字符)的大小。我如何专注于所有c风格的字符串?
以下代码显示问题。您可以看到const char [15]的特化与“const char [15]”相匹配,但对于“const char [5]”,它将转到Generic。
有没有办法做到这一点?
template <typename T>
struct Test {
static const char* type() { return "Generic"; }
};
template <>
struct Test<const char*> {
static const char* type() { return "const char*"; }
};
template <>
struct Test<const char[]> {
static const char* type() { return "const char[]"; }
};
template <>
struct Test<const char[15]> {
static const char* type() { return "const char[15]"; }
};
template <>
struct Test<char*> {
static const char* type() { return "char*"; }
};
template <>
struct Test<char[]> {
static const char* type() { return "char[]"; }
};
template <typename T>
void PrintType(const T& expected) {
std::cerr << expected << " type " << Test<T>::type() << std::endl;
}
int main(int argc, char* argv[]) {
const char* tmp = "const char*";
PrintType(tmp);
PrintType("const char[]");
PrintType("const char[15]");
PrintType("const char[5]");
}
在Windows 7 - VS 2008中运行时输出
const char* type const char*
const char[] type Generic
const char[15] type const char[15]
const char[5] type Generic
答案 0 :(得分:13)
任何char
数组的特化是:
template< std::size_t N >
struct Test< const char[N] > { ... };
但是,除非您编写更多元函数以将非类型模板参数转换为其文本表示,否则您无法再从char*
返回type()
。
答案 1 :(得分:1)
尝试一下:
#include <cstdio>
#include <string>
template<class T>
void f2(const T& s) // Handle all kinds of string objects
{ std::printf("string object: %s\n", s.c_str()); }
void f2(const char* s) // Handle const char*
{ std::printf("const char*: %s\n", s); }
// ----------------------------------------------------------------------------
template<size_t N>
void f(const char(&s)[N]) // Handle const char array
{ std::printf("const char[%zu]: %s\n", N, s); }
template<size_t N>
void f(char(&s)[N]) // Handle char array
{ std::printf("char[%zu]: %s\n", N, s); }
template<class T>
inline void f(T&& s) // Handle other cases
{ f2(std::forward<T>(s)); }
int main() {
std::string stringObj = "some kind of string object ...";
char charArr[] = "char array";
const char constCharArr[] = "const char array";
const char* constCharPtr = "const char pointer";
f(stringObj);
f(charArr);
f(constCharArr);
f(constCharPtr);
//f("const char array");
}
输出:
string object: some kind of string object ...
char[11]: char array
const char[17]: const char array
const char*: const char pointer
说明
f()
有两种重载:一种用于char数组,另一种用于“其他所有东西”。
f2()
处理“其他所有情况”。