将void函数模板专门化为const char [N]

时间:2011-08-07 13:11:44

标签: c++ templates template-specialization

我有一个模板化函数,我想将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)" 

第一个模板化声明没有任何目的代码......我正在尝试获得将用于我的案例的正确专业化。

2 个答案:

答案 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],但由于你不能部分专门化功能,所以这是不可能的。你可以随时重载它。