作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 X 类......
class X {...}
并且我想为某些类型集的每个不同类型创建一个 X 实例。 (其中一些类型不是类和/或不是我写的。)
为此我想到了:
template<typename T> X& XT();
然后对于每个类型 A、B 和 C:
template<> X& XT<A>() { static X x; return x; }
template<> X& XT<B>() { static X x; return x; }
template<> X& XT<C>() { static X x; return x; }
这行得通吗?这是最好的方法吗?有哪些替代方法?
最佳答案
您不需要特化该函数。你可以简单地这样做:
template<typename T>
X& XT()
{
static X x;
return x;
}
并将其用作:
X &xa = XT<A>();
X &xb = XT<B>();
X &xc = XT<C>();
X &xd = XT<A>(); //xd is same as xa
所有三个对象 xa
, xb
和 xc
是 X 的不同实例。但是,xa
和 xd
是相同的实例,因为它们都调用相同的函数。
这里要注意的一点是,编译器会为每个不同的模板参数实例化不同的函数。所以XT<A>()
是一个不同于 XT<B>()
的函数,并且每个函数都有其自己的 static
局部变量。所以 static
XT<A>()
中的局部变量是与 XT<B>()
中的变量不同的实例.
关于c++ - 模板特化和静态局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9051631/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!