如何从C ++中的现有模板函数定义新函数

时间:2018-08-11 03:42:32

标签: c++ templates

最近我正在学习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>;

如果是这样,它将非常有帮助

2 个答案:

答案 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可以从函数参数(inputoutput)推导出,而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);
}