찾다

 >  Q&A  >  본문

c++ - 根据函数参数数目调用不同的函数

我现在需要对矩阵进行操作,这些操作的过程都是类似的,只是其中的一个算子不同。这些算子有些是对每个元素操作,有些是对相邻之间的进行操作,我尝试用以下的方法去把算子和步骤分离开来,但是问题是对于参数个数不同的情况怎么处理?能不能编译时就确定好该调用的函数?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

<code class="cpp">#include <vector>

using namespace std;

 

template <typename OPER, typename T>

void executor(OPER op, vector<vector<T>>& m)

{

    //--- pre processing

    //...

    //---

    T last = T();

    for (auto& v : m){

        for (auto& a : v){

            // if(varnum == 1)

            op(a);           

            //if(varnum == 2)

            //op(a, last);    // fail

            last = a;

        }

    }

    //--- post processing

    //...

    //---

}

 

 

void f1(float& a)       

{

    a *= 2;

}

void f2(float& a, float b)    // fail 需要两个参数

{

    a -= b;

}

 

int main()

{

    vector<vector<float>> m;

     

    executor(f1, m);

    //executor(f2, m);    // fail

 

    return 0;

}</code>

伊谢尔伦伊谢尔伦2820일 전638

모든 응답(3)나는 대답할 것이다

  • 天蓬老师

    天蓬老师2017-04-17 15:02:27

    우연히 비슷한 행렬 라이브러리를 만들었습니다https://github.com/codehz/mat...
    나도 비슷한 문제에 직면했지만 전자와 후자는 필요하지 않지만 매개변수의 단순한 차이
    제가 취한 해결책은 다음과 같습니다. 콜백 함수의 매개변수 목록을 통해 자동으로 결정 - 다음과 같이 단순화

    으아악

    여기서 function_traits 코드는 컴파일 중에 함수 관련 정보를 얻는 데 사용됩니다.
    if constexpr은 C 17의 기능입니다. constexpr을 제거한 후 컴파일이 실패할 수 있습니다. std::enable_if를 사용하여 해결하세요.

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-17 15:02:27

    구조체에 여러 매개변수를 넣고 구조 포인터를 매개변수로 사용할 수 있나요?

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 15:02:27

    코드를 보면 해결 방법이 많이 있습니다.
    f2의 b는 쉽게 얻을 수 있으므로 executor(std::bind(f2, _1, 2), m);
    또는

    을 사용할 수 있습니다. 으아악

    다른 값인 경우 std::enable_if를 사용하여 실행기의 오버로드를 작성할 수 있습니다. 원칙은 SFINAE 원칙을 사용하는 것입니다.

    회신하다
    0
  • 취소회신하다