任何函数作为模板参数

dec*_*iar 7 c++ templates variadic-functions

#include <iostream>

void padd(int a, int b) { std::cout << a + b << std::endl; }
void psub(int a, int b) { std::cout << a - b << std::endl; }

template <??? op>
class Foo {
public:
    template<typename... Arguments>
    void execute(Arguments... args) {
        op(args ...);
    }
};

int main() {
    auto f1 = Foo<padd>();
    f1.execute(5, 6); // ideally would print 11

    auto f2 = Foo<psub>();
    f2.execute(5, 6); // ideally would print -1

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚如何在C++中将函数(以及,如果可能的话,模板函数)绑定为模板参数.

目前我不知道这是否可能.

这里的一个踢球者是功能签名不能保证是相似的.

编辑:感谢@sehe和@Potatoswatter,我现在的解决方案是:http://ideone.com/0jcbUi .会在适当的时候写下答案.

seh*_*ehe 6

我建议让编译器在适当的时候担心解析函数签名.http://ideone.com/ZeLt1E(代码包括在下面).

如果你需要调整重载集或多态接口,我建议你也看一下BOOST_PHOENIX_ADAPT_FUNCTION.

编辑响应注释:这是一个演示如何直接使用函数指针和/或指针到成员函数作为函数参数.这是另一种极端方法:http://ideone.com/120Ezs

完整代码

#include <iostream>

template <typename F>
struct Foo {
    Foo(F&& f) : f(std::forward<F>(f)) {}

    template<typename... Arguments>
    void execute(Arguments... args) {
        f(args ...);
    }

  private:
    F f;
};

template <typename F>
  Foo<F> make_foo(F&& f = F()) { return {f}; }

void padd(int a, int b) { std::cout << a + b << std::endl; }
void psub(int a, int b) { std::cout << a - b << std::endl; }

int main() {
    auto f = make_foo(padd);
    f.execute(5, 6);

    make_foo(psub).execute(5, 6);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)


dec*_*iar 0

感谢 Potatoswatter 和 sehe 在 C++ Lounge 和这里​​的帮助,我已经制定了我的问题的解决方案。

#include <iostream>
#include <functional>

template <typename func_t, func_t func>
struct Foo {
    template <typename... Arguments>
        void execute(Arguments... args) {
                func(args ...);
        }
};

template <typename T, typename func_t, func_t func>
struct FooMember {
        T member;

        FooMember(T member) : member(member) {}

        template <typename... Arguments>
        void execute(Arguments... args) {
                std::function<void(T&, Arguments ...)> f(func);
                f(this->member, args ...);
        }
};

struct Bar {
        int z;

        Bar(int z) : z(z) {}
        void add(int x, int y) { std::cout << x + y + z << std::endl; }
};

void padd(int x, int y, int z) { std::cout << x + y + z << std::endl; }

int main() {
        auto a = Foo<decltype(&padd), &padd>();
        auto b = FooMember<Bar, decltype(&Bar::add), &Bar::add>(Bar(2));

        a.execute(4, 5, 6); // prints 4+5+6 : 15
        b.execute(4, 5); // prints 4+5+a.z : 4+5+2 : 11

        return 0;
}
Run Code Online (Sandbox Code Playgroud)