C++ 获取类模板成员的函数类型?
我正在尝试编写一个float(float)函数类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
#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)