如何编写检查可变参数函数的Concept?分配器场景技术疑问
关于分配器构造检查Concept的问题
我原本希望创建一个用于检查分配器的Concept,确保无论传入何种模板参数,以下语句都能正确执行:
std::allocator_traits::construct(alloc, ptr, ... /* parameters of constructors for AllocType::value_type */)
最小可复现示例(MRE)
#include <utility> #include <iostream> #include <concepts> template <typename T> struct Allocator { template <typename ...Args> void construct(Args&&... args) { T t { std::forward<Args>(args)... }; t.print(); } }; struct X1 { int i; X1(int i) : i(i) { } void print() { std::cout << i << '\n'; } }; struct X2 { int i; std::string s; X2(int i, std::string s) : i(i), s(std::move(s)) { } void print() { std::cout << i << " - " << s << '\n'; } }; template <template <typename> typename Alloc, typename T, typename... Args> concept can_construct = requires(Alloc<T> a, Args... args) { { T(args...) } -> std::same_as<T>; { a.construct(args...) } -> std::same_as<void>; }; int main() { static_assert(can_construct<Allocator, X1, int>); static_assert(can_construct<Allocator, X2, int, std::string>); // These fail // static_assert(can_construct<Allocator, X2, int>); // static_assert(can_construct<Allocator, X1, int, std::string>); }
当前实现的问题
目前我实现的can_construct Concept并不理想:它需要预先知晓T的构造参数集并逐一检查,且默认假设construct内部会调用T的构造函数,但实际场景可能并非如此。
核心问题
- 仅通过
Alloc和T两个模板参数,如何检查Alloc::construct能否接受T的所有构造函数参数集? - 如何确认传入可变模板的参数集不会引发编译错误?
内容的提问来源于stack exchange,提问作者Osama Ahmad
相关产品推荐
相关产品推荐

