如何解决以下代码中的函数重载歧义

维克多

假设有函数 ovelaodsintdouble

void Print(int v)
{
    cout << v << endl;
}

void Print(double v)
{
    cout << v << endl;
}

有一个函数旨在作为可调用的上述函数之一传入。

template<typename FnT>
void Function(int v, FnT&& fn)
{
    fn(v);
}

但以下代码不明确:

Function(1, Print);

活生生的例子

编译器无法推导出第二个参数的类型。这很容易解决:

Function(1, static_cast<void(*)(int)>(Print));

我相信存在更通用和优雅的方法来解决这个问题。在 STL 算法中,当添加函数重载时,这个问题会被提出。

vector<int> v = { 1,2,3 };
for_each(v.begin(), v.end(), Print); // ambigous code

如何以漂亮的方式解决这个问题?

理查德·霍奇斯

将其包装在一个函数对象中:

#include <iostream>
#include <utility>

void Print(int v)
{
    std::cout << v << std::endl;
}

void Print(double v)
{
    std::cout << v << std::endl;
}

template<typename FnT>
void Function(int v, FnT&& fn)
{
    fn(v);
}

auto print_wrapper() {
    return [](auto&&...args) -> decltype(auto)
    {
        return Print(std::forward<decltype(args)>(args)...);
    };
}

int main()
{
    Function(1, print_wrapper());
}

从理论上讲,我们在这里所做的是使用绷带来修复损坏的设计。

更好的设计是将 的概念定义Print为模板函数对象。然后我们可以专门化它并根据我们的内心需求定制它。

一个(非常完整的)模型boost::hash<>值得任何人花半天的时间作为学习练习。

一个简单的例子:

#include <iostream>
#include <utility>
#include <string>

struct Printer
{
    void operator()(const int& i) const {
        std::cout << i << std::endl;
    }

    void operator()(const double& i) const {
        std::cout << i << std::endl;
    }

    template<class Anything>
    void operator()(const Anything& i) const {
        custom_print(i);
    }
};

struct Foo
{

};
void custom_print(Foo const& f) 
{
    std::cout << "a Foo" << std::endl;
}

template<typename X, typename FnT>
void Function(X const& x, FnT&& fn)
{
    fn(x);
}

int main()
{
    Function(1, Printer());
    Function(1.0, Printer());
    Function(Foo(), Printer());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何解决“ fpclassify”:对重载函数的歧义调用

来自分类Dev

如何解决方法引用中的重载歧义?

来自分类Dev

如何使用SFINAE解决重载函数中的歧义

来自分类Dev

如何使用SFINAE解决重载函数中的歧义

来自分类Dev

如何解码以下代码

来自分类Dev

解决重载函数的歧义

来自分类Dev

如何解决传递给Boost线程的函数中的歧义

来自分类Dev

在C ++中执行以下代码以进行函数重载时,不会输出输出

来自分类Dev

如何解决对重载定义的歧义引用

来自分类Dev

如何解决我的GADT中的歧义

来自分类Dev

如何解决cucumberjs中的歧义问题?

来自分类Dev

如何解决scala代码中的以下错误?

来自分类Dev

如何解释以下代码的输出?(与C中的类型转换有关)

来自分类Dev

在Python中,以下代码如何工作?

来自分类Dev

如何使以下代码中的结果重复?

来自分类Dev

递归在以下代码中如何工作?

来自分类Dev

如何在标签导航中的以下代码中解决错误?

来自分类Dev

如何解决这种歧义?

来自分类Dev

如何解决这种歧义?

来自分类Dev

如何在JMockit中测试以下代码的构造函数调用

来自分类Dev

我如何在以下代码中调用 MathUtils 对象内的 randInt() 函数?

来自分类Dev

以下代码中调用了哪个构造函数?

来自分类Dev

如何消除重载函数的歧义

来自分类Dev

如何优化以下代码?

来自分类Dev

如何简化以下代码?

来自分类Dev

如何阅读以下代码?

来自分类Dev

如何简化以下代码?

来自分类Dev

如何使以下代码更好?

来自分类Dev

如何简化以下代码