Opt-in/模板枚舉類運算符的自定義點

我經常使用enum類作為這樣的標志:

enum class MyFlags : uint32_t {
  None  = 0,
  Flag1 = (1 << 0),
  Flag2 = (1 << 1),
  ...
}

現在我經常想做這樣的組合標志的操作:MyFlags::Flag1 | MyFlags::MyFlags2

因此,我需要一個操作員過載:

MyFlags operator|(MyFlags f1, MyFlags f2)
{
   return static_cast<MyFlags>(uint32_t(f1) | uint32_t(f2));
}

// other operators like =|, &, also defined.

由于我發現自己為各種enum classes做這件事,我想為此寫一個模板,但只激活實際使用標志(opt-in)的枚舉類,所以它不用于所有枚舉。

如何為某些選定的枚舉啟用運算符?以下是我走了多遠:

// What other code here to only select this for selected types?
template <typename T> // Concept instead of typename?
T operator|(T f1, T f2)
{
   return static_cast<T>(uint32_t(f1) | uint32_t(f2));
}

// Other .cpp file
// Here I'd like to do opt-in. Is this done with template specialization? std::enable_if? Other?
// What code here to use the above template for MyFlags?

正如評論中所指出的,如果可能的話,我想使用概念。如果有其他方法,那也沒關系。

? 最佳回答:

因此,您可以提出您的概念:

template<typename T>
concept enable_bitops_for = std::is_enum_v<T> && /* ... */;

template <enable_bitops_for T>
constexpr T operator|(T f1, T f2)
{
   return static_cast<T>(std::to_underlying(f1) | std::to_underlying(f2));
}

現在的問題是如何定義您的概念,使其只滿足于您專門為其啟用的枚舉。

一種經典的方法是模板專業化:

template<typename T>
inline constexpr bool do_enable_bitops_for = false;

template<typename T>
concept enable_bitops_for = std::is_enum_v<T> && do_enable_bitops_for<std::remove_cv_t<T>>;

enum class MyFlags : uint32_t {
  None  = 0,
  Flag1 = (1 << 0),
  Flag2 = (1 << 1),
  ...
};

template<>
inline constexpr bool do_enable_bitops_for<MyFlags> = true;

如果您的枚舉類是在命名空間或類中定義的,則會出現一些問題,因為您必須將命名空間或類專門化。

另一種是某種標簽:

template<typename T>
concept enable_bitops_for = std::is_enum_v<T> && (T::_enable_bitops == T{});

enum class MyFlags : uint32_t {
  None  = 0,
  Flag1 = (1 << 0),
  Flag2 = (1 << 1),
  ...,
  _enable_bitops = 0
};
template<typename T>
concept enable_bitops_for = std::is_enum_v<T> && requires {
    { _enable_bitops(T{}) } -> std::same_as<std::true_type>;
};

enum class MyFlags : uint32_t {
  None  = 0,
  Flag1 = (1 << 0),
  Flag2 = (1 << 1),
  ...
}
std::true_type _enable_bitops(MyFlags);
主站蜘蛛池模板: 国产天堂在线一区二区三区 | 亚洲一区爱区精品无码| AV怡红院一区二区三区| 无码精品人妻一区二区三区免费看| 色视频综合无码一区二区三区| tom影院亚洲国产一区二区| 人妻少妇AV无码一区二区| 国产免费av一区二区三区| 国产成人一区二区三区| 影音先锋中文无码一区| 精品少妇一区二区三区视频| 一区二区三区无码高清| 老湿机一区午夜精品免费福利| 日韩色视频一区二区三区亚洲| 亚洲欧美日韩中文字幕一区二区三区| 无码精品人妻一区二区三区免费看| 中文字幕一区二区人妻| 国产suv精品一区二区33| 国产韩国精品一区二区三区 | 秋霞午夜一区二区| 中文字幕一区二区三区精华液 | 无码一区二区三区在线| 亚洲欧美国产国产综合一区| 一区二区三区高清| 亚洲乱色熟女一区二区三区蜜臀| 亚洲一区二区三区高清不卡| 亚洲一区二区三区丝袜| 激情久久av一区av二区av三区| 成人欧美一区二区三区在线视频| 国产av一区最新精品| 国产精品一区二区三区久久| 天堂不卡一区二区视频在线观看| 夜色阁亚洲一区二区三区| 三上悠亚国产精品一区| 无码少妇一区二区三区浪潮AV | 秋霞电影网一区二区三区| 亚洲AV无码一区二三区| 国产精品无码一区二区三区电影| 一区二区三区国产精品| 精品国产一区二区三区www| 一区二区三区免费视频观看|