首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++概念-我可以有一个约束,要求一个函数出现在一个类中吗?

C++概念-我可以有一个约束,要求一个函数出现在一个类中吗?
EN

Stack Overflow用户
提问于 2019-10-15 20:20:14
回答 3查看 3.6K关注 0票数 12

我在下面有一个简单的代码片段,它使用以下命令编译:

g++-9 -std=c++2a -fconcepts

这是在尝试定义一个需要函数存在的概念。我希望输出结果是"yes“,但事实并非如此。知道为什么吗?谢谢。

代码语言:javascript
复制
#include <iostream>


template <typename T>
concept bool HasFunc1 = 
    requires(T) {
        { T::func1() } -> int;
    };

struct Test
{
    int func1()
    {
        return 5;
    }
};

int main()
{
    if constexpr (HasFunc1<Test>)
        std::cout << "yes\n";
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-15 20:23:06

您正在测试是否存在静态成员函数。你想要的是

代码语言:javascript
复制
template <typename T>
concept bool HasFunc1 = 
  requires(T t) {
      { t.func1() } -> int;
  };
票数 11
EN

Stack Overflow用户

发布于 2019-10-15 20:23:51

尝试自己调用它:

代码语言:javascript
复制
Test::func1();

代码语言:javascript
复制
prog.cc: In function 'int main()':
prog.cc:19:14: error: cannot call member function 'int Test::func1()' without object
   19 |  Test::func1();
      |              ^

哦,对了。func1应该是static成员函数,或者应该在概念中的实例上调用它:

代码语言:javascript
复制
template <typename T>
concept bool HasFunc1 = 
    requires(T t) {
        { t.func1() } -> int;
    };
票数 4
EN

Stack Overflow用户

发布于 2020-06-07 11:27:15

可以在编译时运行概念检查。(操作的检查仅在运行时计算。)

首先,准备一个检查器函数(从技术上讲,这是一个模板化的变量):

代码语言:javascript
复制
template <HasFunc1 h>
constexpr bool HasFunc1_satisfied = true;

那就找个地方检查一下。

代码语言:javascript
复制
// The class to be tested
struct Test
{
    int func1()
    {
        return 5;
    }
};

// Do the test at the compile time
static_assert(HasFunc1_satisfied< Test >);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58394556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档