gpt4 book ai didi

c++ - 如何通过结构的成员推导模板

转载 作者:行者123 更新时间:2023-11-27 23:49:15 24 4
gpt4 key购买 nike

假设我有一些结构并且每个结构都拥有一个枚举作为成员。我想调用结构的方法,但取决于结构的成员,如代码示例所示:

#include <iostream>
#include <string>
#include <type_traits>

enum class Type{
lowercase = 0,
uppercase
};

struct Low{
static constexpr Type cp = Type::lowercase;
};

struct Up{
static constexpr Type cp = Type::uppercase;
};


template<typename Case, typename=void>
struct Printer
{
void print_g(const std::string& s){
std::cout << "just s: " << s << std::endl;
}
};

template<typename X>
struct Printer<X, std::enable_if_t<X::cp == Type::lowercase, void>>
{
void print_g(const std::string& s){
std::cout << "lowercase " << std::nouppercase << s << std::endl;
}
};

template<typename X>
struct Printer <X, std::enable_if_t<X::cp == Type::uppercase, void>>
{
void print_g(const std::string& s){
std::cout << "uppercase " << std::uppercase << s << std::endl;
}
};

int main()
{
Printer<Low> pl;
pl.print_g("hello1");
Printer<Up> p2;
p2.print_g("hello2");
}

但是这个解决方案在我看来并不十分优雅。特别是第一个模板中的 typname=void 部分。只有这样代码才能编译。为什么会这样?对于这种模板特化,是否有更好(更优雅)的解决方案?

最佳答案

在C++17中,你可以使用if constexpr:

template <typename X>
struct Printer
{
void print_g(const std::string& s)
{
if constexpr(X::cp == Type::lowercase)
{
std::cout << "lowercase " << std::nouppercase << s << std::endl;
}
else if constexpr(X::cp == Type::uppercase)
{
std::cout << "uppercase " << std::uppercase << s << std::endl;
}
else
{
std::cout << "just s: " << s << std::endl;
}
}
};

如果您无法访问 C++17,请考虑以下选项:

  • 使用常规的 if...else 语句。您的示例中没有需要条件编译的代码。

  • 在 C++14 中实现 static_if。这是我的演讲,解释了如何去做:Implementing static control flow in C++14

关于c++ - 如何通过结构的成员推导模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47822829/

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