C++ const函数参数.有没有办法只声明单一的功能签名?

yiv*_*ivo 2 c++ class c++11

我正在处理一些项目,并且在复制功能代码方面存在问题.有没有办法只声明一个函数的单一签名,它将适用于const和非const参数?const和非const函数的实现是相同的.

#include <iostream>

template <class Data>
struct Processor {

    int process(const Data &data)
    {
        return 42;
    }

    int process(Data &data)
    {
        return 42;
    }

};

int main() {

    using data_type = int;

    data_type non_const_data = 1;
    const data_type const_data = 2;

    std::cout << Processor<data_type>().process(non_const_data) << std::endl;
    std::cout << Processor<data_type>().process(const_data) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

示例http://ideone.com/tv0TsF

感谢您的答复

UPDATE

这个例子怎么样?

#include <iostream>
#include <vector>

template <class Container, class Function>
struct Invoker {

    const Container& invoke(const Container &container, Function function)
    {
        for (auto &value : container) function(value);
    }

    Container& invoke(Container &container, Function function)
    {
        for (auto &value : container) function(value);
    }

};

int main() {

    std::vector<int> container {1, 2, 3};
    auto fn = [](int val) {
        std::cout << val << std::endl;
    };

    Invoker<decltype(container), decltype(fn)>().invoke(container, fn);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/KnyGdT

dop*_*ime 8

如果两个函数的实现相同,则const仅提供参数函数.在你的情况下,它将适用于非const和const对象.

但是,如果要保留这两个函数,可以根据const参数函数实现非const参数函数.它可以帮助您避免重复的代码.

int process(const Data &data)
{
    return 42;
}

int process(Data &data)
{
    return process(static_cast<const Data&>data);
}
Run Code Online (Sandbox Code Playgroud)


dam*_*ewl 7

我建议只声明最具限制性的那个,即期望const参数的那个.如果存在向其发送非const指针/引用的问题,您可以在调用方法之前始终使其成为const.


M.M*_*M.M 6

是:

int process(const Data &data)
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

这可以用Data,Data &Data const &,以及任何可转换为的东西来调用Data.const引用可以绑定到非const对象或引用.