【发布时间】:2016-09-20 10:15:21
【问题描述】:
这是 this SO question 的变体。我有一个重载函数,它接受不同类型的参数并返回不同类型:
struct mystruct {
auto f (int x, int y) -> int;
auto f (std::string x, int y) -> float;
};
函数f 需要使用其参数之一多次调用自身。
我想定义一个专门用于参数y 的函数,即我想要g(z) = f(z,y)。 g 的返回类型及其唯一参数z 变量的类型,但两种情况下的实现是相同的。
对于这种情况,我能找到的最佳实现是重载 lambda 函数:
template <class F1, class F2>
struct overload_set : F1, F2
{
overload_set(F1 f1, F2 f2) : F1(f1), F2(f2) {}
using F1::operator();
using F2::operator();
};
template <class F1, class F2>
overload_set<F1, F2> overload(F1 f1, F2 f2) {
return overload_set<F1, F2>(f1, f2);
};
struct mystruct {
auto f( std::string x, int y) -> float {
return y+9.3;
}
auto f( int x, int y) -> int
{
auto g = overload (
[=]( int z ) -> int {return f(z,y);},
[=]( std::string z) -> float { return f(z,y); }
);
if ( x == 0 ) {
std::cout << g("this string") << "\n";
return 0;
}
if ( x == 1 ) return y;
return 7;
}
};
int main () {
mystruct h;
std::cout << h.f(1,4) << "\n";
std::cout << h.f(0,2) << "\n";
}
按预期工作,但似乎有点矫枉过正。似乎是一个简单的预处理宏
#define k(z) f(z,y)
也可以。有什么好的方法可以实现吗?
【问题讨论】:
-
你受限于 c++11 吗?为什么不直接使用
auto g(auto z) -> decltype(f(z, y))? -
我试过了,但没有用,如果您发布适用于该方法的代码作为答案,我会接受并感谢您。
-
新案例中
y从何而来?