我想将模板化参数存储到我的命名空间中。
我不知道该怎么做。这是我的代码的简化:
namespace sdc {
template<typename T_output>
T_output last_o[dim_output];
template<typename T_input, typename T_output>
void training(T_input in[], T_output o_a[], T_output o_b[]) {
sdc::last_o = o_a;
}
}
我得到错误:
error: "last_o" is not a function or static data member
我怎么能做这样的事?
最佳答案
代替给定的无效代码
namespace sdc {
template<typename T_output>
T_output last_o[dim_output];
template<typename T_input, typename T_output>
void training(T_input in[], T_output o_a[], T_output o_b[]) {
sdc::last_o = o_a;
}
}
…您可以使用带有 std::vector
的简单 Meyers 单例,如下所示:
#include <vector>
namespace sdc {
using std::vector;
template< class Type >
auto last()
-> vector<Type>&
{
static vector<Type> the_last;
return the_last;
}
template< class Input, class Output>
void training( vector<Input>& in, Vector<Output> a, Vector<Output> b )
{
sdc::last<Output>() = a;
}
} // namespace sdc
请注意,这为每种类型的 Output
维护了一个单独的 sdc::last()
。
如果您想要所有类型的共同历史记录,您必须更详细地指定您打算如何访问它。
免责声明:编译器未触及代码。
如@vsoftco 所述 in commentary在他的回答中,您可以通过使用 C++14 模板化变量来避免单例,与原始代码完全一样,除了使用例如std::vector
而不是原始数组,因为原始数组不可赋值。但出于两个原因,这样做作为一般惯例并不好。首先是臭名昭著的“static initialization order fiasco” pitfall在你最意想不到的时候把你困住。其次,并非代码的所有读者都知道现在支持该语法 - 目前包括并非所有编译器都知道。
关于c++ - 将模板化参数存储到命名空间中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33241995/