部分模板专业化:std::allocator_traits?
Partial template specialization for: std::allocator_traits?
是否可以像这样专门化 std::allocator_traits 模板?
namespace falloc_ {
template<class Tp> class FAllocator ;
}
// partial spec for all falloc_::FAllocator<U>, std::allocator_traits
template<typename Tp>
struct std::allocator_traits<falloc_::FAllocator<Tp> > {
using allocator_type = falloc_::FAllocator<Tp> ;
using value_type = typename allocator_type::value_type ;
// ...
// All the components I need here, I will include all the code if You need them.
// ...
} ;
namespace falloc_ {
template<class Tp> class FAllocator {
public:
using value_type = Tp ;
} ;
}
完整代码在std++20分配器class和分配器,特性class(std::allocator_traits)规范中编译运行。在那种情况下,我的问题实际上是关于实际的正确性,是否根据对标准了解更多的人的说法,是否禁止类似功能 class 重载,或者只是假设因为(完整的)代码是可编译和可执行的并且按照预期的计划工作 - 我可以考虑使用它吗?
另外,我用代码测试了分配器:
std::vector<int, falloc_::FAllocator<int> > mv ;
for (size_t i = 0 ; i < 5 ; i++) {
mv.push_back(i) ;
}
for (int i = 4 ; i > -1 ; i--) {
std::cout << "mv[" << i << "]: " << mv[i] << '\n' ;
}
内存已正确分配和释放,我还检查了 Valgrind。
使用 Gdb,我检查并从
调用了所有函数
std::allocator_traits<falloc_::FAllocator<U> > // U aka int for std::vector<int, falloc_::FAllocator<int> >
提前感谢您的任何见解、建议和忠告。
允许特化std::allocator_traits
模板。见 [namespace.std]/2:
Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std
provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.
没有明确禁止专门化 std::allocator_traits
,因此您可以对您定义的类型 FAllocator
进行专门化。此规则适用于完全专业化和部分专业化。
请记住,您的专业化必须确实满足原始模板的所有 要求。该标准已经指定了每个成员类型的定义和每个成员函数的行为,以至于如果您要编写自己的专业化,它基本上与原始的相同,这违背了这样做的目的。我想您可以在不违反原始要求的情况下向 std::allocator_traits<...>::construct(...)
添加日志语句,但是将这些日志语句放在分配器本身中会更容易。如果您坚持将它们放在您的 allocator_traits
专业化中,您还必须注意不要 运行 与 [dcl.constexpr]/7.
冲突
我看不出任何情况下 std::allocator_traits
专业化是有意义的。
是否可以像这样专门化 std::allocator_traits 模板?
namespace falloc_ {
template<class Tp> class FAllocator ;
}
// partial spec for all falloc_::FAllocator<U>, std::allocator_traits
template<typename Tp>
struct std::allocator_traits<falloc_::FAllocator<Tp> > {
using allocator_type = falloc_::FAllocator<Tp> ;
using value_type = typename allocator_type::value_type ;
// ...
// All the components I need here, I will include all the code if You need them.
// ...
} ;
namespace falloc_ {
template<class Tp> class FAllocator {
public:
using value_type = Tp ;
} ;
}
完整代码在std++20分配器class和分配器,特性class(std::allocator_traits)规范中编译运行。在那种情况下,我的问题实际上是关于实际的正确性,是否根据对标准了解更多的人的说法,是否禁止类似功能 class 重载,或者只是假设因为(完整的)代码是可编译和可执行的并且按照预期的计划工作 - 我可以考虑使用它吗?
另外,我用代码测试了分配器:
std::vector<int, falloc_::FAllocator<int> > mv ;
for (size_t i = 0 ; i < 5 ; i++) {
mv.push_back(i) ;
}
for (int i = 4 ; i > -1 ; i--) {
std::cout << "mv[" << i << "]: " << mv[i] << '\n' ;
}
内存已正确分配和释放,我还检查了 Valgrind。 使用 Gdb,我检查并从
调用了所有函数std::allocator_traits<falloc_::FAllocator<U> > // U aka int for std::vector<int, falloc_::FAllocator<int> >
提前感谢您的任何见解、建议和忠告。
允许特化std::allocator_traits
模板。见 [namespace.std]/2:
Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace
std
provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.
没有明确禁止专门化 std::allocator_traits
,因此您可以对您定义的类型 FAllocator
进行专门化。此规则适用于完全专业化和部分专业化。
请记住,您的专业化必须确实满足原始模板的所有 要求。该标准已经指定了每个成员类型的定义和每个成员函数的行为,以至于如果您要编写自己的专业化,它基本上与原始的相同,这违背了这样做的目的。我想您可以在不违反原始要求的情况下向 std::allocator_traits<...>::construct(...)
添加日志语句,但是将这些日志语句放在分配器本身中会更容易。如果您坚持将它们放在您的 allocator_traits
专业化中,您还必须注意不要 运行 与 [dcl.constexpr]/7.
我看不出任何情况下 std::allocator_traits
专业化是有意义的。