我目前正在研究類似 WebGL 的 OpenGL 包裝器
(一個天真的條件(可能的internalformat常量glTexImage2D,如果你感興趣的話。我真的為其中一些寫了一個 JS 表決議器/條件生成器)來說明我的觀點。那是一個assert......)
這種檢查的邏輯很簡單:
bool check(const unsigned int var)
{
return var == CONSTANT_1 || var == CONSTANT_2 || var == CONSTANT_...;
}
但是,根據上面的示例,這最多可以擴展 84 個可能的常量,這是......是的。而且我完全意識到宏不會將其減少一個荒謬的數量,但它仍然會有所作為,而且我覺得它也會更干凈。更不用說具有不同運算子的類似方式的其他宏的可能性。
所以我的想法是使用宏。畢竟,使用std::initializer_list``, std::vector , std::array` 或其他容器在運行時進行此檢查是微不足道的,但由于所有這些常量在編譯時都是已知的,我覺得這似乎是不必要的。
由于可能的常量的數量是可變的,我認為沒有辦法不使用可變引數宏。然而我不知道我將如何實作這一點。我想到的一種可能的方法是根據引數的數量(類似于 this)多載宏,但這似乎不必要地復雜。
本質上,我正在尋找一個可以滿足以下要求的宏:
MACRO(var, CONSTANT_1, CONSTANT_2, CONSTANT_3)
擴展到
var == CONSTANT_1 || var == CONSTANT_2 || var == CONSTANT_3
具有任意數量的常量(重要!和困難的部分)。
uj5u.com熱心網友回復:
您可能想使用 C 17折疊運算式:
template<class... Args>
bool check(const unsigned int var, const Args&... args)
{
return ((var == args) || ...);
}
然后你可以呼叫這樣的東西:
check(var, CONSTANT_1, CONSTANT_2, CONSTANT_3);
uj5u.com熱心網友回復:
您不需要宏。如果您在 a 中有常量constexpr std::array,則可以使用std::any_of以下方法:
#include <algorithm> // std::any_of
inline static constexpr std::array<unsigned int, 2> arr_of_const{ CONSTANT_1, CONSTANT_2 };
consteval bool check(unsigned int var)
{
return std::any_of(arr_of_const.cbegin(), arr_of_const.cend(), [var](auto ele) { return var == ele; });
}
uj5u.com熱心網友回復:
這里不需要使用宏,一個簡單的函式和有效值陣列就可以完成這項作業:
#include <array>
#include <algorithm>
#include <iostream>
constexpr int CONSTANT_1 = 0;
constexpr int CONSTANT_2 = 1;
constexpr int CONSTANT_3 = 2;
constexpr int CONSTANT_4 = 3;
constexpr std::array<int, 3 > VALID_CONSTANTS = { CONSTANT_1, CONSTANT_2, CONSTANT_3 };
template <size_t N>
constexpr bool check(int value, const std::array<int, N>& values)
{
return std::find(values.begin(), values.end(), value) != values.end();
}
int main()
{
std::cout << check(CONSTANT_1, VALID_CONSTANTS) << "\n";
std::cout << check(CONSTANT_4, VALID_CONSTANTS) << "\n";
}
通過一個小的修改,代碼在編譯時被完全評估:
#include <array>
#include <algorithm>
#include <iostream>
constexpr int CONSTANT_1 = 0;
constexpr int CONSTANT_2 = 1;
constexpr int CONSTANT_3 = 2;
constexpr int CONSTANT_4 = 3;
struct VALID_CONSTANTS
{
static constexpr std::array<int, 3 > values = { CONSTANT_1, CONSTANT_2, CONSTANT_3 };
};
template <typename Values>
constexpr bool check(int value)
{
return std::find(Values::values.begin(), Values::values.end(), value) != Values::values.end();
}
int main()
{
std::cout << check<VALID_CONSTANTS>(CONSTANT_1) << "\n";
std::cout << check<VALID_CONSTANTS>(CONSTANT_4) << "\n";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/326730.html
