【发布时间】:2021-03-15 11:09:45
【问题描述】:
我想要一个通用函数,它需要一个模板并通过函数重载进行一些专门化。但是,当使用关键字常量或使用指针时,会调用错误的函数。 我想要的是:
#include <Eigen/Dense>
#include <iostream>
template <typename T>
void myFunction(const T variable){
std::cout << "Generic called";
}
void myFunction(const Eigen::MatrixXd* variable){
std::cout << "Eigen matrix overload";
}
int main(int argc, char **argv) {
Eigen::MatrixXd my_variables;
myFunction(&my_variables);
return 0;
}
这会打印“Generic called”。虽然我希望它会调用重载。
我已经玩了一点。如果没有 const 关键字,我会得到预期的行为:
#include <Eigen/Dense>
#include <iostream>
template <typename T>
void myFunction(T variable){
std::cout << "Generic called";
}
void myFunction(Eigen::MatrixXd* variable){
std::cout << "Eigen matrix overload";
}
int main(int argc, char **argv) {
Eigen::MatrixXd my_variables;
myFunction(&my_variables);
return 0;
}
按预期打印“特征矩阵过载”。 并且没有指针:
#include <Eigen/Dense>
#include <iostream>
template <typename T>
void myFunction(const T variable){
std::cout << "Generic called";
}
void myFunction(const Eigen::MatrixXd variable){
std::cout << "Eigen matrix overload";
}
int main(int argc, char **argv) {
Eigen::MatrixXd my_variables;
myFunction(my_variables);
return 0;
}
同时打印“特征矩阵过载”。
那么为什么第一个例子不打印“特征矩阵重载”?
编辑: 我发现将 const 放在指针之后确实会调用正确的函数,但这会使我的指针 const 并且我(也)想要我的对象常量。
#include <Eigen/Dense>
#include <iostream>
template <typename T>
void myFunction(const T variable){
std::cout << "Generic called";
}
void myFunction(Eigen::MatrixXd* const variable){
std::cout << "Eigen matrix overload";
}
int main(int argc, char **argv) {
Eigen::MatrixXd my_variables;
myFunction(&my_variables);
return 0;
}
使用void myFunction(const Eigen::MatrixXd* const variable) 再次调用泛型函数。
编辑2: blindcrone 的答案解释了为什么第一个选项调用泛型函数。但是有了这个解释,我希望在我的第三个代码块中也会调用泛型(使用 const 但不是指针,也适用于类似于第三个代码块但使用参数作为参考的情况)。有人也可以解释一下吗?
【问题讨论】:
-
它不会做你想做的,因为
const T中的const对重载解析没有任何作用,T是所有东西的完美匹配,而const Eigen::MatrixXd*不是完美匹配为Eigen::MatrixXd*.. 也许你是想写const T*?
标签: c++ templates overloading