gpt4 book ai didi

c++ - 概念的重载/特化

转载 作者:行者123 更新时间:2023-12-01 14:22:21 25 4
gpt4 key购买 nike

有没有办法重载/专门化模板等概念?

考虑以下非常简单的情况,我们只想将某些类型标记为“简单”:

// overload/specialization for MyClass - WOULD BE NICE - BUT FAILS

template <typename T>
concept simple = false;

class MyClass;
template <>
concept simple<MyClass> = true;

// workaround, rather verbose - SUCCEEDS

template <typename T>
concept simple = Info<T>::is_simple;

template <typename T>
struct Info
{
static inline constexpr bool is_simple = false;
};

class MyClass;
template <>
struct Info<MyClass>
{
static inline constexpr bool is_simple = true;
};

有没有更简单的方法来实现这一点?

最佳答案

Is there a way to overload/specialize concepts like templates?

没有。您不能重载或专门化概念。概念就是它们。这是设计使然。

如果我有一个概念Frobnable ,这个概念总是意味着它的意思。模板特化的根本问题在于,特化实际上与主模板没有任何关系。我们只是喜欢......为了理智起见,确保它们是。除非我们不这样做,比如 vector<bool>确实没有与vector<T> 相同的界面对于所有其他 T .

但是如果Frobnable<T>意味着与 Frobnable<T*> 完全不同的东西(或在此处插入您的专业选择),那么您不可能就概念包含的含义提出任何规则 - 或者根本无法对概念进行真正的推理。

概念比模板更结构化


所以回到你的问题,如何做

[...] we just want to flag certain Types as 'simple':

你应该为此使用一个变量模板,然后可能有一个概念只是引用那个变量模板。

template <typename T>
inline constexpr bool is_simple = false;

template <>
inline constexpr bool is_simple<MyClass> = true;

template <typename T>
concept simple = is_simple<T>::value;

或者甚至不考虑这个概念,直接在 requires 子句中使用变量模板。

关于c++ - 概念的重载/特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63383312/

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