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

标签 c++ templates namespaces

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

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

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/

相关文章:

c++ - std::map with key as templated structs with enum member

c++ - 声明类和命名空间的问题

c++ - 分析 .dmp 文件

html - Django - 如何使用 View 删除对象

c++ - 可变参数模板求和运算左关联

c++ - 如何解决这个 C++ 多重继承类似问题

c++ - 命名空间被视为类型

c++ - QextSerialPort 的字符编码问题 (Qt/C++)

c++ - pthread 在预期之后执行

c++ - 显式删除移动构造函数