-1

有没有办法Caller<pfn>从构造函数中实例化Foo()

#include <iostream>
using namespace std;

struct Foo
{
    template<void(*pfn)()>
    struct Caller
    {
        static void call() { pfn(); }
    };

    template<typename FN>
    Foo(FN fn)
    {
        Caller<FN>::call();  // illegal type for non-type template parameter 'pfn'
    }
};

void Bar()
{
    cout << "bar" << endl;
}

int main(int argc, char *argv[])
{
    Foo foo(&Bar);
    return 0;
}
4

3 回答 3

1

您需要为类提供函数的类型,而不仅仅是为构造函数提供。这只是一种解决方法,您可以将其用作起点:

template <typename F>
struct Foo
{
    struct Caller
    {
        static void call(F fn)
        {
            fn();
        }
    };

    Foo(F fn)
    {
        Caller::call(fn);
    }
};

void Bar()
{
    cout << "bar" << endl;
}

int main()
{
    Foo<decltype(Bar)> foo(Bar);
}

如果Foo不能是模板库,那么使用这个:

struct Foo
{
    template <typename F>
    struct Caller
    {
        static void call(F fn)
        {
            fn();
        }
    };

    template <typename F>
    Foo(F fn)
    {
        Caller<F>::call(fn);
    }
};

void Bar()
{
    cout << "bar" << endl;
}

int main()
{
    Foo foo(Bar);
}
于 2013-11-13T19:38:51.143 回答
0

也许你的意思是他如下:

#include <iostream>

using namespace std;

struct Foo
{
    template<void(*pfn)()> // CHANGED
    struct Caller
    {
        static void call() { pfn(); }
    };
};

void Bar()
{
    cout << "bar" << endl;
}

int main(int argc, char *argv[])
{
    Foo::Caller<&Bar>::call(); // CHANGED
}

注意这里的变化:

 template<void(*pfn)()>
于 2013-11-13T19:41:41.653 回答
0

这是不可能的。

编译时常量函数指针在作为函数参数传递后不能用作一个。

此外,单独使用函数指针类型无法获得特定函数的编译时常量函数指针。

于 2013-11-13T20:04:14.927 回答