2011-01-06 32 views
3

我有一个模板类,它依赖于两个模板参数来计算它的值,但只有一个用于构造。我想在一生中减轻对第二个的依赖。我正在通过使用模板化的静态函数来计算这些值,然后创建一个实例。该类中的所有成员都是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; 
} 

我设想的移动语义,而是因为我只含常量POD类型实在是没有任何交换和移动简单地复制和销毁。上述合理/有效吗?我读过的所有东西都表明它没问题!有一个更好的方法吗?

+3

我看不出有任何理由使用`静态常量类型&`而不是`静const类型“。你认为它对你有什么好处? – 2011-01-06 13:51:07

+0

我可以绑定到一个右值?没有复制? – 2011-01-06 13:52:33

回答

2

这应该没问题。由于参考temp被绑定到临时对象,因此临时对象的生存期延长到temp的生存期,该期限延伸到main()的末尾。

但我没有看到任何真正的理由在那里使用参考。为什么不只是:

{ 
    static const FOO<member> foo = FOO<member>::CreateFOO<scope>(); 
    return &foo; 
} 

您的编译器可能可以优化掉拷贝构造函数。如果没有,你说这是所有的POD成员,所以没什么大不了的。您可能会担心static deinitialization order fiasco。或者,也许你确定他们永远不会从析构函数中使用。

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; 
}