C++ 获取类模板成员的函数类型?

C++ 获取类模板成员的函数类型?,c++,templates,C++,Templates,我正在尝试编写一个float(float)函数类 #pragma once class float_func { struct concept { virtual ~concept() {} virtual float operator()(float) = 0; virtual concept* clone() = 0; }; template <typename T> class i

我正在尝试编写一个float(float)函数类

#pragma once
class float_func
{
    struct concept 
    {
        virtual ~concept() {}
        virtual float operator()(float) = 0;
        virtual concept* clone() = 0;
    };
    template <typename T>
        class impl : public concept
    {
        public:
            impl(const T& ptr) : ptr_(ptr) {};
            virtual float operator()(float arg1) {
                return ptr_(arg1);
            }
            virtual concept* clone() {
                return new impl<T>(ptr_);
            }
        private:
            T ptr_;

    };

    public:
    float_func() { object_ = nullptr; }
    template <typename T> float_func(const T& ptr) : object_(new impl<T>(ptr)) {}
    float_func(const float_func& other) : object_(other.object_->clone()) {}
    ~float_func() { delete object_; }
    template <typename T> 
    float_func& operator=(const T& ptr) {
        delete object_;
        object_ = new impl<T>(ptr);
        return *this;
    }
    float_func& operator=(const float_func& other) {
        delete object_;
        object_ = other.object_->clone();
        return *this;
    }
    float operator()(float arg1) {
        return (*object_)(arg1);
    }
    private:
    concept* object_;
};
你能解释一下错误吗


std::function如何处理此类模板参数,或者如何修改代码以支持
float\u func f3=mul3

表达式
mul3
具有函数类型:
float(float)
而不是函数指针类型(如
float(*)(float)
)。因此,
float\u func
的ctor模板推断出
T
为该函数类型
float(float)

这导致了
impl
的实例化,它反过来试图声明此函数类型的成员(
T ptr
)--但这是非法的[temp.arg.type]/3:

如果声明通过依赖于模板参数的类型获取函数类型,并且这导致不使用函数声明符语法形式的声明具有函数类型,则程序的格式错误。[示例:

模板结构A{
静态T;
};
typedef int函数();
A;//格式错误:将声明A::t
//作为静态成员函数
-[结束示例]


我能想到的最简单的解决方案是按值接受sink参数:

template <typename T> float_func(T ptr)
template float_func(T ptr)
这将推导函数类型表达式的函数指针类型(强制函数到指针转换)


另一种方法是用衰减的
T
实例化
impl
,例如
newimpl(ptr)

为什么你需要重新发明自行车而不是使用
boost::function
std::function
?我正在学习类型擦除,而不是重新发明。
float_func.cc
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale(336) : wa
rning C4530: C++ exception handler used, but unwind semantics are not enabled. S
pecify /EHsc
e:\src\tmp\type_erasure\float_func.h(14) : warning C4180: qualifier applied to f
unction type has no meaning; ignored
        e:\src\tmp\type_erasure\float_func.h(28) : see reference to class templa
te instantiation 'float_func::impl<T>' being compiled
        with
        [
            T=float (float)
        ]
        float_func.cc(20) : see reference to function template instantiation 'fl
oat_func::float_func<float(float)>(T (__cdecl &))' being compiled
        with
        [
            T=float (float)
        ]
e:\src\tmp\type_erasure\float_func.h(22) : error C2207: 'float_func::impl<T>::pt
r_' : a member of a class template cannot acquire a function type
template <typename T> float_func(const T& ptr)
float_func(float (&ptr)(float)) // T = float(float)
template<class T> struct A {
    static T t;
};
typedef int function();
A<function> a; // ill-formed: would declare A<function>::t
               // as a static member function
template <typename T> float_func(T ptr)