搜尋

首頁  >  問答  >  主體

c++ - 模板中定义类型未知的函数

请问如何在一个模板中定义类型未知的函数呢?
我需要将一段程序的多个步骤和其中的某个操作分离,比如说:

#include <iostream>

template <typename T>
T adder(T a, T b)
{
    return a + b;
}

template <T F(T, T)>    //--- Here
T executor(T a, T b)
{
    return F(a, b);
}

int main()
{
    std::cout << executor<adder>(1, 2);
    std::cout << executor<adder>(3.0f, 4.0f);
    return 0;
}

但是上面template <T F(T, T)>中的T是不能被编译器识别的,怎样解决这个问题呢?

我自己找到答案了,这个贴就让沉掉吧(不知道怎么关闭╮(╯▽╰)╭):

#include <iostream>

template <typename T>
T adder(T a, T b)
{
    return a + b;
}

template <typename T, T F(T, T)>
T executor(T a, T b)
{
    return F(a, b);
}

int main()
{
    std::cout << executor<int, adder>(1, 2);
    std::cout << executor<float, adder>(3.0f, 4.0f);
    return 0;
}
天蓬老师天蓬老师2804 天前606

全部回覆(1)我來回復

  • 怪我咯

    怪我咯2017-04-17 15:20:49

    在這裡首先要確定好adder的類型,才能推到出executor的類型。而原始程式中adder的類型是由executor的函數參數決定的,推導先後序出了問題,所以可以透過手動給出adder類型的方法來解決。當然也許有更好的方法?

    #include <iostream>
    
    template <typename T>
    T adder(T a, T b)
    {
        return a + b;
    }
    
    template <typename T, T F(T, T)>
    T executor(T a, T b)
    {
        return F(a, b);
    }
    
    int main()
    {
        std::cout << executor<int, adder>(1, 2);
        std::cout << executor<float, adder>(3.0f, 4.0f);
        return 0;
    }
    

    回覆
    0
  • 取消回覆