C++20:使用概念实现std::is_constructible
C++20: Implement std::is_constructible using concepts
是否有一种可移植的方法可以使用概念来实现std::is_constructible
,而不使用STL
,只使用requires
表达式或模板元编程?
考虑这个代码:
template <class T, class... Args>
struct is_constructible
: std::bool_constant<requires {
new T(std::declval<Args>()...);
}> {
};
它适用于除引用之外的其他数据类型,因为不能new
引用类型。
// Test cases
auto main() -> int {
static_assert(is_constructible<int>::value);
static_assert(is_constructible<int, int>::value);
static_assert(is_constructible<int, float>::value);
static_assert(!is_constructible<int, int *>::value);
static_assert(is_constructible<int &, int &>::value);
static_assert(is_constructible<int &&, int &&>::value);
static_assert(!is_constructible<void, void>::value);
static_assert(!is_constructible<int(), int()>::value);
static_assert(is_constructible<int (*)(), int()>::value);
static_assert(!is_constructible<intptr_t, int *>::value);
static_assert(!is_constructible<int &, float &>::value);
static_assert(std::is_constructible<int>::value);
static_assert(std::is_constructible<int, int>::value);
static_assert(std::is_constructible<int, float>::value);
static_assert(!std::is_constructible<int, int *>::value);
static_assert(std::is_constructible<int &, int &>::value);
static_assert(std::is_constructible<int &&, int &&>::value);
static_assert(!std::is_constructible<void, void>::value);
static_assert(!std::is_constructible<int(), int()>::value);
static_assert(std::is_constructible<int (*)(), int()>::value);
static_assert(!std::is_constructible<intptr_t, int *>::value);
static_assert(!std::is_constructible<int &, float &>::value);
return {};
}
否。当然不是";干净漂亮";。
事实上,在标准化过程中,早期的提案试图使用requires
表达式来实现constructible_from
,但有太多的角落案例,我们放弃了,而是根据类型特征来指定它。
相关文章:
- Centos7 g++ "to_string is not in a member of std"
- Where is std::hardware_destructive_interference_size?
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- What is the std::chrono::time_point equivalent of std::numer
- What is std::vector::_emplace_back_slow_path / std::vector::
- Is std::is_trivially_copyable wrong?
- Why is std::abs(9484282305798401ull) = 9484282305798400?
- What is std::invoke in c++?
- What is std::set::equal_range for?
- Is std::initializer_list{x, y, z} (CTAD) valid?
- Is a log(n) std::find_if possible?
- Is there a std::bytes?
- std::is_nothrow_constructible when constructor is inherited
- IS STD ::功能与使用自动一样有效
- Visual Studio: "str() is not a member of std::ostringstream"
- is compare_exchange_weak for std::shared_ptr broken in msvs
- Matlab's is empty for a std::vector ( C++)
- Is std::make_unique SFINAE-friendly?
- VC++ 2010 "array is not a member of std"错误
- Android NDK chrono epoch is not correct (std::chrono::high_r