【发布时间】:2020-01-24 09:44:59
【问题描述】:
让我们考虑两个同名的函数:
int func(int&)
{
return 7;
}
int func(const int&)
{
return 5;
}
让int mutableValue = 5 在某处定义。 call(mutableValue, func) 中的模板函数 call 是否有可能只使用 int func(int&)?
我不想使用static_cast<int(&)(int&)> - 因为它太吵了。
天真的实现:
template<typename Arg, typename Ret>
void call(Arg& val, Ret (&fun)(Arg&))
{
fun(val);
}
适用于 gcc,但不适用于 clang - 解决方案必须适用于两个编译器。
只接受const Arg& 很容易。删除 const Arg& 过载并没有帮助。
【问题讨论】:
-
尝试改用
template<typename Arg, typename Callable> void call(Arg& val, Callable fun) { fun(val); } -
@RemyLebeau 这没有任何帮助,因为
func(int&)和func(const int&)都匹配Callable... -
有
Ret可以推导出来,还是decay_t<Arg>(&fun)(Arg&)ok? -
在实际用例中
Rets 与Args 不同。在func的情况下它们是相同的只是巧合。 -
您可以在电话中提供吗? (是这样,你可能有一个解决方案)。如果一定要推演,恐怕你无法解决歧义。
标签: c++ templates metaprogramming