klamauk 发表于 2021-9-4 15:58

C++问题

有一个函数模板myprint,我想把它作为参数传递给另一个函数模板fun。要怎么做才可以?
template<typename F>
void fun(F f)
{
    f();
}

template<typename T>
void myprint()
{
    std::cout << "myprint" << std::endl;
}

//错误,未找到匹配的重载函数
fun(myprint);

另一个问题是有如下的变参函数。是不是没办法处理传过来的参数?
void myprint(...)
    {
      
    }

亮哥vvv 发表于 2021-9-4 15:58

因为泛型不是所有类型都能表示的,给你两种解决方式一种是特化,一种是通过仿函数。
#include <iostream>
using namespace std;
typedef void(*Fu)();

//方式1:仿函数
class Myprint
{
public:
        void myprint()
        {
                std::cout << "myprint" << std::endl;
        }
};

template<typename F>
void fun(F f)
{
        f.myprint();
}

//方式2:特化
template<>
void fun<Fu>(Fu f)
{
        f();
}

template<typename T>
void myprint()
{
        std::cout << "myprint" << std::endl;
}

int main()
{
        fun(myprint<int>);
        fun(Myprint());

        system("pause");
        return 0;
}

gchq2005 发表于 2021-9-4 17:08


这样算不,,{:301_998:}

梦爱 发表于 2021-9-4 17:11

std::function<void(void)>   这个定义可以作为参数穿进去

klamauk 发表于 2021-9-4 17:20

myprint是一个函数模板,不是普通函数。

klamauk 发表于 2021-9-4 17:29

亮哥vvv 发表于 2021-9-4 16:54
因为泛型不是所有类型都能表示的,给你两种解决方式一种是特化,一种是通过仿函数。

仿函数中myprint不是一个函数模板。
特化那个不用特化也可以这样调用,fun(myprint<int>);

亮哥vvv 发表于 2021-9-4 17:40

klamauk 发表于 2021-9-4 17:29
仿函数中myprint不是一个函数模板。
特化那个不用特化也可以这样调用,fun(myprint);

奥,那泛型就能表示函数指针,那就不用特化了,你直接调吧,那个Myprint 类 我忘了,可以把它定义成模板类也,实现方式和写的代码差不多,调的时候 fun(Myprint()<int>) 给上类型就行了。

亮哥vvv 发表于 2021-9-4 17:52

klamauk 发表于 2021-9-4 17:29
仿函数中myprint不是一个函数模板。
特化那个不用特化也可以这样调用,fun(myprint);

我查了一下,确实特化不是在这用的,泛型可以表示任意类型的,之前说错了。

klamauk 发表于 2021-9-4 18:01

亮哥vvv 发表于 2021-9-4 17:52
我查了一下,确实特化不是在这用的,泛型可以表示任意类型的,之前说错了。
答案给你吧。第二个问题会吗?

aonima 发表于 2021-9-4 19:33

c++各种语法太麻烦了,还是c好用
页: [1] 2
查看完整版本: C++问题