【发布时间】:2020-08-10 07:03:44
【问题描述】:
我想写一个通用的验证函数。所以我尝试编写一个元程序。 但它没有被编译,这是正确的。谁能告诉我实现它的方法。
我正在发布我的示例代码。可以有 3 种或更多类型的结构(此处为 A、B、C),一些具有特定类型的标头,另一种具有其他类型的标头,有些甚至没有标头。所以我想编写一个程序来正确选择所需的函数(这里是 f1()、f2() 来验证结构头。我不想使用 Boost Hana 或任何其他反射库。
#include <iostream>
using namespace std;
struct Header
{
int i;
};
struct OrderHeader
{
int i; int j;
};
struct A
{
Header header;
int val;
};
struct B
{
OrderHeader order_header;
int val;
int c;
};
struct C
{
int val;
int c;
};
bool f1(Header h)
{
return h.i == 1 ? true : false;
}
bool f2(OrderHeader oh)
{
return (oh.i == 1 and oh.j == 1) ? true : false;
}
template<typename St, typename = enable_if_t<is_same_v<decltype(St::header), Header>>>
using v1 = bool;
template<typename St, typename = enable_if_t<is_same_v<decltype(St::order_header), OrderHeader>>>
using v2 = bool;
template<typename St>
bool validate(St s)
{
if constexpr(is_same_v<v1<St>, bool>)
{
return f1(s.header);
}
else if constexpr(is_same_v<v2<St>, bool>)
{
return f2(s.order_header);
}
return true;
}
int main(int argc, char** argv)
{
A at{1,1};
A af{};
C c{};
B b{};
cout << boolalpha << validate(at) << endl;
cout << boolalpha << validate(af) << endl;
cout << boolalpha << validate(b) << endl;
cout << boolalpha << validate(c) << endl;
return 0;
}
【问题讨论】: