我有一个模板化函数,我想将foo
专门化为const char[N]
(硬编码字符串)
template<typename T>
const std::string foo() ;
template<typename T,int N>
const std::string foo<T[N]>() { return "T[N]"; } //this doesn't work for const char[12]
template<>
const std::string foo<const char*>() { return "Const char"; } //this doesn't work for const char[12]
template<typename T>
void someother function(T obj)
{
string s = foo<T>(); //I want to overload when T is const chat[N]
}
function("Hello World"); //When calling like this the type is const char[12]
我以为我可以做一些像Here那样的事情 但它不起作用,因为我没有传递参数,只是模板类型 我可以这样做,但没有理由将参数传递给该函数。
该示例不起作用,因为我没有传递变量。尝试了一些事情,但无法让它发挥作用。
这是我唯一无法解决的专业化问题。我专门为int,string和其他类型的函数,他们工作正常。
error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const __cdecl foo<char const [12]>(void)"
第一个模板化声明没有任何目的代码......我正在尝试获得将用于我的案例的正确专业化。
答案 0 :(得分:3)
你必须分两步完成。由于你不能部分地专门化一个函数,你必须让函数调用一个类,它可以是部分专用的。所以下面的内容会有效。
#include <typeinfo>
#include <iostream>
namespace detail {
template <typename T> struct foo_helper {
static std::string helper() {
return typeid(T).name();
}
};
template <int N> struct foo_helper<const char [N]> {
static std::string helper() {
return "Const Char Array";
}
};
}
template <typename T> std::string foo(T& obj) {
return detail::foo_helper<T>::helper();
}
int main() {
std::string x;
const char c[] = "hard coded";
std::cout << foo(x) << std::endl;
std::cout << foo(c) << std::endl;
}
这为常量字符串正确调用了特化。我还将T obj
更改为T& obj
,因此g ++会将静态字符串作为数组传递,而不是指针。有关部分特化的更多详细信息,请查看http://www.gotw.ca/publications/mill17.htm
答案 1 :(得分:1)
你做不到。这是不可能的。你需要一个部分专门化专门用于const char(&)[N]
,但由于你不能部分专门化功能,所以这是不可能的。你可以随时重载它。