编译时的Typename到函数名的映射
typename to function name mapping at compile time
我想实现的事情与这篇文章类似:根据模板参数选择函数名
在c库中,为了处理不同的数值类型(float, double, complex -float, complex-double),将会有不同名称的函数。
在创建这样一个c库的包装器时,我想找出一种方法来实现重载的效果,并对所有数值类型使用相同的函数名。现在我使用模板专门化:
#include <iostream>
float saxpy(float x) {
return (1-x);
}
double daxpy(double x) {
return (1+x);
}
template <typename T>
T axpy(T x);
template<>
inline float axpy<float>(float x) {
return saxpy(x);
}
template<>
inline double axpy<double>(double x) {
return daxpy(x);
}
int main() {
auto z0 = axpy(1.0f);
auto z1 = axpy(1.0);
std::cout << z0 << " " << z1 << std::endl;
return 0;
}
还有另一种使用类型特征的方法:
#include <type_traits>
#include <iostream>
float saxpy(float x) {
return (1-x);
}
double daxpy(double x) {
return (1+x);
}
struct saxpy_traits {
static float feval(float x) { return saxpy(x); }
};
struct daxpy_traits {
static double feval(double x) { return daxpy(x); }
};
template <typename T>
struct axpy_traits {
typedef typename std::conditional<std::is_same<T, float>::value, saxpy_traits, daxpy_traits>::type Func;
inline static T feval(T x) {
return Func::feval(x);
}
};
template<typename T>
inline T axpy(T x) {
return axpy_traits<T>::feval(x);
}
int main() {
auto z0 = axpy(1.0f);
auto z1 = axpy(1.0);
std::cout << z0 << " " << z1 << std::endl;
return 0;
}
有更优雅的方式吗?谢谢你。
由于我不知道什么是真正的"优雅",我提出两种替代方法:
float saxpy(float x)
{
return 1.0f - x;
}
double daxpy(double x)
{
return 1.0 + x;
}
namespace v1 {
float axpy(float x) { return saxpy(x); }
double axpy(double x) { return daxpy(x); }
} // namespace v1
namespace v2 {
struct Axpy
{
float operator()(float x) const { return saxpy(x); }
double operator()(double x) const { return daxpy(x); }
};
static constexpr Axpy axpy;
} // namespace v2
第一个版本简单地定义了两个重载函数。这类似于标准库所采用的方法,例如std::sqrt
.
第二个版本定义了一个具有重载operator()
的函数对象。这个版本允许像
std::vector<float> fs { 1.f, 2.f, 3.f, 4.f };
std::vector<float> rs(fs.size());
std::transform(fs.begin(), fs.end(), rs.begin(), v2::axpy);
相关文章:
- 将函数类成员映射到类本身内部
- 使用std::函数映射对象方法
- 内联映射初始化的动态atexit析构函数崩溃
- 从函数角度看ID到文件路径的内部与外部映射
- C++ 已停止工作静态映射函数
- C++中的映射函数
- 从 lambda 内部返回 C++11 中的 lambda 类型(平面映射函数)
- 如何将值传递给MFC消息映射函数on_command
- 创建高阶映射函数时,应该使用指针、引用或值
- 什么是 C++ 中的映射函数
- 使用变量参数映射函数并通过字符串 c++ 调用
- OpenCV 3.1 重映射函数类型值错误
- std::映射函数指针
- 在一个简单的映射函数中避免IF
- 相当于使用lambda的python映射函数
- 更好的数据结构映射函数与多个参数(键)
- 使用 c++11 构造映射函数
- 反向映射函数关系(c++)
- 类C++中的映射函数
- c++映射函数中的向量相等