1

我对 C++ 模板没有太多经验,所以我的术语可能不正确。请多多包涵,欢迎指正。

我有通用类型fixed_buf<N>

// in foo.h
template <int N>
class fixed_buf {
 private:
  unsigned char data[N];
 public:
  const unsigned char* begin() const {
    return std::begin(data);
  }

  const unsigned char* end() const {
    return std::end(data);
  }
};

我想定义一个通用to_hex函数

// in foo.h
template <typename T> std::string to_hex(const T& b);

// in foo.cpp
template <typename T> string to_hex(const T& b) {
  string r;
  hex(b.begin(), b.end(), back_inserter(r));
  return r;
}

使用显式实例化我也有以下内容:

// in foo.cpp
template string to_hex(const vector<unsign char>&);

我应该如何显式实例to_hexfixed_buf<N>?可能吗?

4

1 回答 1

1

“显式实例化”

这意味着告诉编译器从具有某些指定类型的函数模板创建一个函数,即使它可能不需要(例如,能够链接它或减少编译时间)。

模板可以看作是“类型级函数”。您to_hex将某种类型作为参数并“返回”某种类型的函数。

to_hex :: T -> to_hex<T>

fixed_buf也是一个类型级别的函数。它需要一些(编译时类型级别)整数并返回(结构)类型:

fixed_buf :: int(N) -> fixed_buf<N>

您不能“传递”fixed_bufto_hex; 它不是类型,而是类型级别的函数。您只能通过fixed_buf. 如果您不知道要传递给什么(类型级别)整数,fixed_buf那么您需要将其转换为(类型级别)函数:

\N -》 to_hex(fixed_buf(N)) :: int(N) -> to_hex<fixed_buf<N>>

如果没有一些指定的类型级别整数,这不是一个类型;编译器只能实例化类型(= 在这种情况下完全应用的模板)。

因此,您可以显式实例化to_hex<fixed_buf<42>>(这是一个函数),但不能to_hex<fixed_buf<N>>(模板)。

您可以显式实例化to_hex<fixed_buf<1>>, to_hex<fixed_buf<2>>, ... 不过;但我不认为这样做是合理的


如果您的意思不是实例化而是“专业化”,那么再次不,您不能提供模板专业化,因为它需要是部分专业化(您不知道N)并且这些功能不允许使用。解决方案:

  • 将实现放入模板中struct;他们可以部分专业化。

  • 使用重载:

    template <int N>
    string to_hex(const fixed_buf<N>& b) { /* implementation */ }
    

    这是一个应该可以工作的重载(不是部分专业化;函数模板不允许这些)。

于 2019-04-18T18:29:31.710 回答