我有一个模板化的类,它依赖于两个模板参数来计算它的值,但只有一个用于构造。我想在其生命周期中减轻对第二个的依赖。我正在考虑通过使用模板化静态函数来计算值,然后创建一个实例。这个类中的所有成员都是const POD类型,并且在应用程序启动时会创建很多这个类。
template < class member >
class FOO {
public:
FOO() : a(7) {};
template < class scope >
static FOO CreateFOO()
{
return FOO();
};
private:
const int a;
};
template < class member, class scope >
const FOO< member >* function()
{
static const FOO< member >& temp = FOO< member >::CreateFOO< scope >();
return &temp;
}
int main() {
const FOO<int>* b = function< int, int >();
return 0;
}
我考虑过移动语义,但因为我只是包含const POD类型,所以实际上没有任何交换和移动只是复制和销毁。以上是否合理/有效?我读过的所有内容都表明它没问题!有更好的方法吗?
答案 0 :(得分:2)
这应该没问题。由于引用temp
绑定到临时对象,因此临时对象的生命周期延长到temp
的生命周期,该生命周期延伸到main()
的末尾。
但我认为没有任何真正的理由在那里使用参考。为什么不呢:
{
static const FOO<member> foo = FOO<member>::CreateFOO<scope>();
return &foo;
}
您的编译器可能可以优化复制构造函数。如果没有,你说它是所有POD成员,所以没什么大不了的。
无论哪种方式,您可能会担心static deinitialization order fiasco。或者也许你确定它们永远不会被用于析构函数。
答案 1 :(得分:0)
我知道这是一个人为的例子。仍然没有理由给出static FOO CreateFOO()
的存在,在这种情况下除了默认构造对象之外什么也没做。如果您只是创建了一个模板构造函数:
template < class member >
class FOO {
public:
template < class scope > FOO(scope);
然后你会有一个单身人士的标准表格:
template < class member, class scope >
const FOO< member >& function(scope your_scope)
{
static FOO<member> temp(your_scope);
return temp;
}