如何在 const 表达式(decltype、模板...)中获取 class 的实例
How to get an instance of class in const expressions (decltype, templates ...)
如何获取一个class的实例?
大家都会回答:调用它的构造函数
喜欢
class_name()
那如果class没有默认构造函数呢?
我有一个接受字节缓冲区作为参数的函数:
template<typename BUFFER>
void fun(BUFFER& buf) {
我需要对BUFFER
进行一些限制,我选择了最新的ranges
template<std::ranges::range BUFFER>
void fun(BUFFER& buf) {
而且这是一个字节缓冲区,所以std::ranges::begin(buf)
的return类型应该是byte
然后我添加了一些要求
template<std::ranges::range BUFFER>
requires std::same_as<byte, decltype(*std::ranges::begin(BUFFER()))>
void fun(BUFFER& buf) {
这不好,因为我们不知道 BUFFER
是否有默认构造函数
那么,有没有比下面代码更好的解决方案呢?
template<typename T>
struct instanceof_t {
T value;
};
template<typename T>
using instanceof = instanceof_t<T>::value;
template<std::ranges::range BUFFER>
requires std::same_as<byte, decltype(std::ranges::begin(instanceof<BUFFER>))>
void fun(BUFFER& buf) {
std::declval
可以使用:
template<std::ranges::range BUFFER>
requires std::same_as<byte, decltype(std::ranges::begin(std::declval<BUFFER>()))>
void fun(BUFFER& buf)
{
// ...
}
但可能真的会用到约束:
template<std::ranges::range BUFFER>
requires (requires(BUFFER buf) {
{std::ranges::begin(buf) } -> std::same_as<std::byte>;
})
void fun(BUFFER& buf)
{
// ...
}
已经有range_value_t
用于获取范围类型R
的迭代器类型的值类型,所以你的情况应该是
#include <ranges>
template<std::ranges::range BUFFER>
requires std::same_as<std::byte, std::ranges::range_value_t<BUFFER>>
void fun(BUFFER& buf);
如何获取一个class的实例?
大家都会回答:调用它的构造函数
喜欢
class_name()
那如果class没有默认构造函数呢?
我有一个接受字节缓冲区作为参数的函数:
template<typename BUFFER>
void fun(BUFFER& buf) {
我需要对BUFFER
进行一些限制,我选择了最新的ranges
template<std::ranges::range BUFFER>
void fun(BUFFER& buf) {
而且这是一个字节缓冲区,所以std::ranges::begin(buf)
的return类型应该是byte
然后我添加了一些要求
template<std::ranges::range BUFFER>
requires std::same_as<byte, decltype(*std::ranges::begin(BUFFER()))>
void fun(BUFFER& buf) {
这不好,因为我们不知道 BUFFER
是否有默认构造函数
那么,有没有比下面代码更好的解决方案呢?
template<typename T>
struct instanceof_t {
T value;
};
template<typename T>
using instanceof = instanceof_t<T>::value;
template<std::ranges::range BUFFER>
requires std::same_as<byte, decltype(std::ranges::begin(instanceof<BUFFER>))>
void fun(BUFFER& buf) {
std::declval
可以使用:
template<std::ranges::range BUFFER>
requires std::same_as<byte, decltype(std::ranges::begin(std::declval<BUFFER>()))>
void fun(BUFFER& buf)
{
// ...
}
但可能真的会用到约束:
template<std::ranges::range BUFFER>
requires (requires(BUFFER buf) {
{std::ranges::begin(buf) } -> std::same_as<std::byte>;
})
void fun(BUFFER& buf)
{
// ...
}
已经有range_value_t
用于获取范围类型R
的迭代器类型的值类型,所以你的情况应该是
#include <ranges>
template<std::ranges::range BUFFER>
requires std::same_as<std::byte, std::ranges::range_value_t<BUFFER>>
void fun(BUFFER& buf);