gpt4 book ai didi

c++ - 想要类型上的 constexpr 开关盒

转载 作者:IT老高 更新时间:2023-10-28 22:17:02 26 4
gpt4 key购买 nike

我目前正在使用这个技巧来获得基于类型的 cstring:

template<class ListT> static char constexpr * GetNameOfList(void)
{
return
std::conditional<
std::is_same<ListT, LicencesList>::value, "licences",
std::conditional<
std::is_same<ListT, BundlesList>::value, "bundles",
std::conditional<
std::is_same<ListT, ProductsList>::value, "products",
std::conditional<
std::is_same<ListT, UsersList>::value, "users",
nullptr
>
>
>
>;
}

但是这段代码不是很好看,如果我们想检查更多的类型,这可能是不可读的。是否可以像有一个 switch case block 一样做同样的事情?

实际上,代码比这更复杂,因为 std::conditional 需要一些类型,所以我们需要一些类来解决问题:

struct LicenceName { static char constexpr * value = "licences"; };

例如。

最佳答案

我认为使用模板特化会更容易


示例代码:

#include <iostream>
struct A{};
struct B{};
struct C{};
struct D{};

template<typename T> constexpr const char* GetNameOfList();
//here you may want to make it return nullptr by default

template<>constexpr const char* GetNameOfList<A>(){return "A";}
template<>constexpr const char* GetNameOfList<B>(){return "B";}
template<>constexpr const char* GetNameOfList<C>(){return "C";}

int main(){
std::cout << GetNameOfList<A>() << '\n';
std::cout << GetNameOfList<B>() << '\n';
std::cout << GetNameOfList<C>() << '\n';
//std::cout << GetNameOfList<D>() << '\n'; //compile error here
}

关于c++ - 想要类型上的 constexpr 开关盒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40746309/

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