【发布时间】:2011-09-02 05:04:12
【问题描述】:
我想为成员函数和运算符创建代理。它们必须具有相同的返回类型和参数,并且必须适用于多个类,这些类作为模板参数给出。即使该类没有特定的成员函数或运算符,我希望它编译而不是因错误而失败,本质上是 SFINAE。如果X 有一个方法f() 和Y 没有任何名为f 的方法,我需要Proxy<X> 有一个f() 以及调用X::f(),我需要Proxy<Y>编译和实例化没有任何问题。
在previous question of mine 之后,从已知函数中提取返回类型不再是问题。但是,如果没有这样的功能,它会失败并出现错误。
我已经知道几个模板元编程技巧来确定给定函数是否存在,如果存在则启用某个功能,但是,它们都只适用于硬连线函数名称而不是任意名称,这严重限制了它们在这种情况下的使用因为我需要多个函数使用相同的构造。
我只需要检查是否存在任何具有给定名称的函数,如果有重载变体我不需要检查是否存在特定的变体,自动模板推导解决了这个问题(或者我希望如此)
我当前的代码如下所示:
template <class T>
class Proxy
{
// using my resultof solution
template <class... Args>
resultof(T::f, Args...) f (Args... x)
{
return x.f(x...);
}
// using another return type extraction solution
template <class... Args>
typeof(T::f(std::declval<Args>()...)) f (Args... x)
{
return x.f(x...);
}
T x;
};
即使 T 没有任何名为 f 的函数,它也应该编译。不幸的是,两个版本都因错误而失败。
resultofbeing的实现
#define resultof(f, ...) typeof(Param<__VA_ARGS__>::Func(f))
template <class... Args>
class Param
{
public:
template <class R>
static R Func (R (*) (Args...));
template <class R, class C>
static R Func (R (C::*) (Args...));
template <class R, class C>
static R Func (R (C::*) (Args...) const);
};
【问题讨论】:
标签: c++ templates return-value overloading c++11