gpt4 book ai didi

c++ - 如何为另一个模板类型重载模板类方法?

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:39 24 4
gpt4 key购买 nike

在不使用 Boost 的情况下,C++03 中的标准方法是什么:

  1. 重载模板类方法,其中模板类型只出现在方法的返回值中,或者
  2. 为另一个模板化类型特化一个模板类方法。

换句话说,如何让它发挥作用:

template <typename T, int N> struct Vector { T x[N]; };

struct Sampler
{
template <typename T>
T next() {
// Do some work and return a value of type T.
return T();
}

template <typename T, int N>
Vector<T, N> next() {
// Do some different work and return a value of type Vector<T, N>.
return Vector<T, N>();
}
};

int main() {
Sampler sampler;
sampler.next<double>();
sampler.next<Vector<float, 2> >();
return 0;
}

正如所写,next() 的两次使用都调用了第一种方法,而我希望第二次使​​用调用了第二种方法。

最佳答案

看起来您要求模板函数的部分特化。这不是语言中的内容,但您可以使用标记分派(dispatch)或类模板来模拟它。下面是一个带有标签分发的例子:

template <typename T> struct tag{};
struct Sampler
{
template <typename T>
T next() {
return next(tag<T>());
}

private:
template <typename T>
T next(tag<T>) {
return T();
}

template <typename T, int N>
Vector<T, N> next(tag<Vector<T,N> >) {
return Vector<T, N>();
}
};

然后你像这样使用它:

sampler.next<double>();
sampler.next<Vector<double,2> >();

Live demo

请注意,在 C++11 之前的第二行的最后一个 >> 标记之间需要一个空格。

关于c++ - 如何为另一个模板类型重载模板类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40150176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com