最近我正在学习C ++中的模板函数。我想知道是否有任何简单的方法可以做以下事情。
例如,我已经在C ++中定义了一个模板函数,如下所示:
template <typename T, float t_p>
void func_a(T* input, T* output):
{
output = input / t_p;
}
现在,我想基于此模板函数为f_p = 4.0定义另一个模板函数。我知道我可以做以下事情:
template <typename T>
void func_b(T* input, T* output):
{
func_a<T,4.0>(input, output);
}
但是这段代码看起来很沉重。特别是当我有很多输入变量时。我想知道是否有什么办法可以做到如下所示
template <typename, T>
func_b = func_a<T , 4.0>;
如果是这样,它将非常有帮助
答案 0 :(得分:1)
也许有点离题,但我希望给您一个有用的建议:切换模板参数的顺序。
我的意思是:编写func_a()
如下(我将int
用于t_p
,因为正如SM指出的,float
值不能是有效的模板参数)
template <int t_p, typename T>
void func_a(T* input, T* output):
{ output = input / t_p; }
要点是T
可以从函数参数(input
和output
)推导出,而t_p
不能推导,因此必须加以说明。
如果顺序首先是T
,然后是t_p
,则还必须说明T
,因此(例如)在func_b()
中,您必须写
func_a<T,4>(input, output);
如果顺序首先是t_p
,然后是T
,则必须仅说明t_p
,并且可以让编译器推断出T
类型。所以你只需写
func_a<4>(input, output);
在这种情况下有所改善,但在其他情况下可能会有用。
答案 1 :(得分:1)
您不能使用函数来实现,但是可以使用函子来实现。 S.M。指出,您不能将float
用作模板非类型参数,因此我们将其替换为int
。我还假设您要对值进行操作,而不要对指针(取消引用指针或使用引用)进行操作。
template<int t_p>
struct func_a
{
template<typename T>
void operator()(const T& input, T& output) const
{
output = input / t_p;
}
};
using func_b = func_a<4>;
using func_c = func_a<5>;
现在您可以通过以下方式使用这些函子:
void foo()
{
int a = 100;
int b;
func_a<2>()(a, b);
func_b()(a, b);
func_c()(a, b);
}
请注意,您需要额外的空括号来创建函子。
如果您想使用float
,可以执行以下操作:
struct func_a
{
func_a(float p) : p(p) { }
template<typename T>
void operator()(const T& input, T& output) const
{
output = input / p;
}
private:
const float p;
};
void foo()
{
const auto func_b = func_a(4);
const auto func_c = func_a(5);
float a = 100;
float b;
func_a(2)(a, b);
func_b(a, b);
func_c(a, b);
}