gpt4 book ai didi

c++ - 我怎样才能有一个受约束的运算符模板?

转载 作者:行者123 更新时间:2023-11-30 02:18:18 25 4
gpt4 key购买 nike

我正在尝试使我的类可转换为任何枚举类型。

enum dst_1 { /*...*/ };
enum dst_2 { /*...*/ };
class src { /*...*/ };

src s;
dst_1 d1 = s;
dst_2 d2 = s;

不想手动为每个枚举类型添加转换,因此以下不是可接受的解决方案:

// OK, but tedious - you must consider each enum type
class src
{
public:
operator dst_1() const { /*...*/ }
operator dst_2() const { /*...*/ }
// ...
};

使转换成为模板对模板参数无法推导不起作用:

// NOT OK: T cannot be deduced
class src
{
public:
template< typename T > using Enum = enable_if_t< is_enum_v< T >, T >;
template< typename T > operator Enum< T >() const { /*...*/ }
};

我能找到的唯一解决方案是可变参数模板,但我不喜欢它,因为它会强制用户指定计划使用的枚举:

// ALMOST OK, but still tedious - you must know in advance what enums will be used
src< dst_1, dst_2 > s;
dst_1 d1 = s;
dst_2 d2 = s;

那么,有更好的解决方案吗?理想情况下我想写:

src s;
dst_1 d1 = s;
dst_2 d2 = s;

最佳答案

Making the conversion a template does not work for the template parameter cannot be deduced:

它不能按照你做的方式推导,因为 T 在这里是一个非推导的上下文:

template< typename T > using Enum = enable_if_t< is_enum_v< T >, T >;

这不能以同样的方式推导出 T:

template <typename T> struct identity { using type = T; }

template <typename T> void foo(typename identity<T>::type);
foo(0); // nope

这个运算符模板的正确写法是:

template <typename T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
operator T() const;

或者:

template <typename T, std::enable_if_t<std::is_enum_v<T>, int> = 0> using Enum = T;
template <typename T> operator Enum<T>() const;

请注意,别名必须T,而不是其他任何东西。

关于c++ - 我怎样才能有一个受约束的运算符模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52429275/

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