【问题标题】:Creating a concept for a non-template class with template methods [duplicate]使用模板方法为非模板类​​创建概念[重复]
【发布时间】:2022-01-15 22:27:01
【问题描述】:

因此,我正在尝试创建一个概念来检查结构/类中是否包含模板方法 void func(auto)

struct S
{
    void func(auto param)
    {
        // Do stuff ...
    }
};

Struct S 没有任何模板参数,但它的成员有。我将模板参数传递给概念“typename _Param”,但在使用概念时需要指定此参数。

template <typename _T, typename _Param>
concept MyConcept = requires(_T&& obj, _Param&& param)
{
    {obj.func(param)};
};

// I don't want to specify 'int', it doesn't guarantee that S::func would be instantiated with this parameter. 
void workWithObject(MyConcept<int> auto&& obj);

int main()
{

    S s;
    workWithObject(s);

    return 0;

}

是否可以在不指定具体类型的方法参数的情况下使用 MyConcept?

【问题讨论】:

  • "如果结构/类中有模板方法" 你为什么要关心函数是否是模板?
  • 不要使用以下划线开头的标识符,然后是大写字母。这些是为实现保留的。
  • 没有示例workWithObject 做了什么以及为什么它需要这个要求,很难判断您解决问题的尝试是否正确。这是一个来自XY problem 的问题示例。我认为只有当你有带有模板参数的模板时,这可能会有一个降神会,但workWithObject 声明并不表示这种情况。
  • @aschepler,感谢您的提示!
  • 您可以测试obj.func(expr) 是否对expr 的任意数量的特定类型有效,但我认为不适用于所有可能的类型。如果您使用私有类型,您可以知道至少涉及一个模板,但这并不排除一个函数被限制为允许除某些类型之外的所有类型。

标签: c++ templates c++20 c++-concepts member-functions


【解决方案1】:

我认为它有效。

template <typename _T>
concept MyConcept = requires(_T&& obj, auto&& param)
{
    {obj.func(param)};
};

void workWithObject(MyConcept auto&& obj); 

【讨论】:

  • auto 不允许在 requires 表达式参数中。 MSVC 错误地允许这样做。
  • 很不幸。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
  • 2022-01-22
  • 2011-06-11
  • 2020-12-16
相关资源
最近更新 更多