gpt4 book ai didi

c++ - 使用不同的enable_if条件选择方法

转载 作者:行者123 更新时间:2023-12-02 10:11:36 24 4
gpt4 key购买 nike

我想编写一个通用的验证函数。因此,我尝试编写一个元程序。
但是它不会被编译,正确的是。谁能告诉我实现这一目标的方法。
我正在发布示例代码。可以有3种或更多类型的结构(此处为A,B,C),有些具有特定类型的 header ,另一种具有其他类型的 header ,有些甚至没有 header 。因此,我想编写一个可以正确选择所需功能的程序(在此使用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;
}

最佳答案

if constexpr可以是部分编译的一种方法,但是if内部的条件必须始终是可编译的。在您的情况下,v1<St>v2<St>仅在St的类型正确时才存在,因此会出现错误。
您可以改为使用变量模板的专用化,例如像这样

template<typename, typename = void>
constexpr bool is_v1 = false;

template<typename St>
constexpr bool is_v1<St, enable_if_t<is_same_v<decltype(St::header), Header>>> = true;

template<typename, typename = void>
constexpr bool is_v2 = false;

template<typename St>
constexpr bool is_v2<St, enable_if_t<is_same_v<decltype(St::order_header), OrderHeader>>> = true;

template<typename St>
bool validate(St s)
{
if constexpr (is_v1<St>)
{
return f1(s.header);
}
else if constexpr (is_v2<St>)
{
return f2(s.order_header);
}

return true;
}
现在, is_v1<St>is_v2<St>始终返回一些值( truefalse),并且代码应为compile1。

1 f2()中还有一个错字: oh.i == 1 and oh.j == 1应该是 oh.i == 1 && oh.j == 1
还要注意 h.i == 1 ? true : false是互斥的,仅 h.i == 1就足够了。

关于c++ - 使用不同的enable_if条件选择方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63335538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com