C++ 有单位类型吗?
Does C++ have a unit type?
我知道 C++ 标准库有一个单位类型——我以前见过它——但我不记得它叫什么了。以一个"m"开头,我知道的就这么多,相当于这个定义:
struct Unit {};
基本上,单位类型是一种只有一个不同值的类型 - 与具有零值的 void
和具有两个值的 bool
形成对比。
如果您必须知道,我的特定用例是关于具有联合成员的模板 class 的构造函数。它看起来像这样:
template<typename T>
struct foo {
union {
T t;
std::string str;
} data;
foo(T const& t) {
data.t = t;
}
foo(std::monostate unused, std::string const& str) {
data.str = str;
}
};
为了能够区分两个构造函数,如果T
等于std::string
,第二个构造函数中需要一个哨兵参数。 void
当然不会起作用, bool
也没有意义,因为传入 true
和 false
之间没有区别——需要的是一个单位类型。
它被称为 std::monostate
(C++17 起)。它还将 ==
运算符和其他一些运算符重载为 return true,以便 std::monostate
的所有实例都相等。
C++ 有任意多的单元类型,包括
std::nullptr_t
std::monostate
std::tuple<>
struct unit {};
我知道 C++ 标准库有一个单位类型——我以前见过它——但我不记得它叫什么了。以一个"m"开头,我知道的就这么多,相当于这个定义:
struct Unit {};
基本上,单位类型是一种只有一个不同值的类型 - 与具有零值的 void
和具有两个值的 bool
形成对比。
如果您必须知道,我的特定用例是关于具有联合成员的模板 class 的构造函数。它看起来像这样:
template<typename T>
struct foo {
union {
T t;
std::string str;
} data;
foo(T const& t) {
data.t = t;
}
foo(std::monostate unused, std::string const& str) {
data.str = str;
}
};
为了能够区分两个构造函数,如果T
等于std::string
,第二个构造函数中需要一个哨兵参数。 void
当然不会起作用, bool
也没有意义,因为传入 true
和 false
之间没有区别——需要的是一个单位类型。
它被称为 std::monostate
(C++17 起)。它还将 ==
运算符和其他一些运算符重载为 return true,以便 std::monostate
的所有实例都相等。
C++ 有任意多的单元类型,包括
std::nullptr_t
std::monostate
std::tuple<>
struct unit {};