【问题标题】:Functor to variadic template function函子到可变参数模板函数
【发布时间】:2012-03-29 08:34:38
【问题描述】:

我想将仿函数制作成泛型函数,但出现编译器错误。 代码如下:

template <class T>
struct Creator
{
    template <typename...Ts>
    static std::shared_ptr<T> create(Ts&&... vs)
    {
        std::shared_ptr<T> t(new T(std::forward<Ts>(vs)...));
        return t;
    }
};

class Car:
        public Creator<Car>
{
    private:
        friend class Creator<Car>;
        Car()
        {
        }
};

int main()
{
    auto car=Car::create();
    std::function< std::shared_ptr<Car> () > createFn=&Car::create;

    return 0;
}

我在 GCC 4.6.3 中的第二个语句(第一个是可以的)中收到以下错误:

error: conversion from ‘<unresolved overloaded function type>’
       to non-scalar type ‘std::function<std::shared_ptr<Car>()>’ requested

任何提示表示赞赏。

【问题讨论】:

  • 在我看来,您正在尝试复制 std::make_shared。对吗?
  • @TamásSzelei:这只是从我的真实应用中提炼出来的例子。此代码将成为对象工厂的一部分,它将根据提供的键返回基本类型的智能指针。下面的答案是我想看到的。

标签: c++ templates c++11 template-meta-programming


【解决方案1】:

如果需要模板函数的指针,必须先实例化模板。

std::function<std::shared_ptr<Car>()> createFn = &Car::create<>;

这会让它在 clang++ 3.1 上编译,但是 g++ 4.8 仍然拒绝编译,我认为这是一个错误。

您可以提供一个 lambda 函数:

std::function<std::shared_ptr<Car>()> createFn = []{ return Car::create(); };

【讨论】:

  • 谢谢。我实际上尝试了您的第一个解决方案,但并没有怀疑编译器。 Clang 3.0 也编译此代码。我会向 GCC 报告错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2015-07-07
相关资源
最近更新 更多