作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是 earlier question 的续集问题(关于不同的主题) .下面的代码采纳了 Dehstil 关于使用特化的建议。
应该如何专门化具有模板模板参数的函数?
下面的代码(其中两条特化行不编译)使问题具体化。
#include <cassert>
template<typename S> struct PA1 {};
template<typename S> struct PA2 {};
template<typename S> struct PB {};
template<typename S> struct PC {};
template<typename S> struct A1 { typedef PA1<S> P; };
template<typename S> struct A2 { typedef PA2<S> P; };
template<typename S> struct B { typedef PB <S> P; };
template<typename S> struct C { typedef PC <S> P; };
template<typename S, template<typename> class T> char fn(typename T<S>::P);
template<typename S, template<typename> class T> char fn(typename T<S>::P)
{
return 'a';
}
template<typename S> char fn<B<S> >(B<S>::P) { return 'b'; }
template<typename S> char fn<C<S> >(C<S>::P) { return 'c'; }
int main()
{
PA1<int> pa1;
PA2<int> pa2;
PB<int> pb;
PC<int> pc;
assert( (fn<int, A1>(pa1)) == 'a' );
assert( (fn<int, A2>(pa2)) == 'a' );
assert( (fn<int, B>(pb)) == 'b' );
assert( (fn<int, C>(pc)) == 'c' );
}
四个函数调用 fn<...,...>() 在调用时具有相同的签名很重要,因为它们本身将驻留在适用于四个类 A1/A2/B/C 的模板类中.
最佳答案
C++ 标准不允许函数模板的部分特化!
重载你的函数而不是特化它们。
阅读关于Why Not Specialize Function Templates?的解释作者:Herb Sutter
然后阅读为什么重载而不是专门化:Template Specialization and Overloading 作者:Herb Sutter
编写一个类模板调用
并将它们特化为:
template<class S, template<typename> class T>
struct call
{
static char fn(typename T<S>::P &p)
{
return ::fn<S,T>(p);
}
};
template<class S>
struct call<S,B>
{
static char fn(typename B<S>::P &p)
{
return ::fn<S>(p);
}
};
template<class S>
struct call<S,C>
{
static char fn(typename C<S>::P &p)
{
return ::fn<S>(p);
}
};
然后就可以使用这个类模板来统一调用所有的函数了:
assert( (call<int, A1>::fn(pa1)) == 'a' );
assert( (call<int, A2>::fn(pa2)) == 'a' );
assert( (call<int, B>::fn(pb)) == 'b' );
assert( (call<int, C>::fn(pc)) == 'c' );
查看在线演示:http://www.ideone.com/TISIT
另请注意 ideone.com 完整解决方案中的重载函数模板(以上链接)
关于c++ - 模板模板参数的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5644448/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!