在CPP文件的匿名名称空间中具有模板函数是否合适
Is it proper to have a template function inside an anonymous namespace of a cpp file?
我想在CPP文件的匿名名称空间中具有模板函数,纯粹是STD ::不同大小的阵列类型的助手函数。此功能不得在此翻译单元之外的任何地方使用。
对我来说很令人惊讶,当我在MSVC 14.1(简化代码)中尝试时,这立即奏效:
namespace
{
template<std::size_t SIZE>
bool isPushed(std::uint32_t id, std::array<std::uint32_t, SIZE>& states)
{
if(id >= states.size())
{
return false;
}
return ((states[id] & 32U) > 0U);
}
}
这是否符合C 标准?
根据我所知道的,模板总是需要在标题中声明(通常也实现),为什么不在这种情况下?
这是否符合C 标准?
绝对。
根据我所知道的,模板总是需要在标题中声明(通常也实现),为什么不在这种情况下?
仅当模板用于多个翻译单元(读取.cpp文件)时,这主要是正确的。有多种方法可以使用extern template
在.cpp文件中实现模板。请参阅https://msdn.microsoft.com/en-us/library/by56e477.aspx。
但是,当它仅在一个.cpp文件中使用时,在.cpp文件中定义它是完全可以的。
其他信息,响应OP的评论
来自https://timsong-cpp.github.io/cppwp/n3337/temp#4
模板名称具有链接。
来自https://timsong-cpp.github.io/cppwp/n3337/basic.link#2.2
- 当名称具有内部链接时,它表示它表示的实体可以由同一翻译单元中其他范围的名称引用。
来自https://timsong-cpp.github.io/cppwp/n3337/basic.link#4
在未命名的名称空间内直接或间接声明的未命名命名空间或名称空间具有内部链接。所有其他名称空间都有外部链接。具有命名空间范围的名称,上面尚未给出内部链接的名称,如果是
的名称,则具有与封闭名称空间相同的链接...
- 模板。
从上面,我们可以得出结论,isPushed
具有内部链接。它只能在翻译单元中引用。
- 函数是否可以访问传递给main()的参数
- 根据某个函数是否存在启用模板
- 无论如何,我可以确定构造函数是否存在吗?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 由并发无序映射查找线程调用的函数是否安全?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 从其存储的回调中删除 std::函数是否安全
- 析构函数是否会自动调用 delete[] C++?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 移动构造函数是否C++过时?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 此函数是否会在C++中创建内存泄漏?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 如何检测构造函数是否与抛出的析构函数无关