我正在处理一些项目,并且在复制功能代码方面存在问题.有没有办法只声明一个函数的单一签名,它将适用于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)
感谢您的答复
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)
如果两个函数的实现相同,则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)
是:
int process(const Data &data)
{
return 42;
}
Run Code Online (Sandbox Code Playgroud)
这可以用Data,Data &和Data const &,以及任何可转换为的东西来调用Data.const引用可以绑定到非const对象或引用.