gpt4 book ai didi

c++ - 将模板化参数存储到命名空间中

转载 作者:行者123 更新时间:2023-11-27 22:55:47 25 4
gpt4 key购买 nike

我想将模板化参数存储到我的命名空间中。

我不知道该怎么做。这是我的代码的简化:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com