繁体   English   中英

C ++模板:用作模板类参数

[英]C++ Templates: Function as Template Class Parameter

因此,在C ++中,我们可以将函数作为模板参数传递,如下所示:

template <typename func>
int tester(func f)
{
    return f(10);
}

因此,我有一个使用函数的模板类,并且我一直在像这样使用它,每次我将函数和变量传递给它时。

template <typename type_t>
class TCl
{
    ...
    template <typename func>
    int Test(func f, type_t Var>
    {
         // Blah blah blah
    }
};

但我想使函数成为类模板参数之一,以使其易于使用。 所以我首先尝试了这个:

template <typename func>
template <typename type_t, func f>
class TCl
{
    ...
};

但是当我编译它时,我得到:

编译器错误C3857:不允许使用多个类型的参数列表

因为上帝禁止我的代码实际上应该在我第一次尝试时进行编译。

现在我的问题是,尽管我知道该函数的参数类型(在这种情况下为size_t,size_t),但返回类型可以是任何东西,只要有一个适合type_t的比较运算符即可。

经过数小时的在线阅读,我找到了一个可行的解决方案。

template <typename type_t, typename ret_t, ret_t f(size_t, size_t)>
class TCl
{
    ...
};

在工作的同时,它破坏了代码的美感。 而且,我将更喜欢类似原始示例中的示例,在该示例中,我指定了func类型,而不必担心指定返回类型。

那么有人有什么建议吗?

另外,没有助推器。

编辑:解决了!

感谢大伙们。 我使用了Jarod42的解决方案。

@Drax&Lightness Races在轨道上:

我曾考虑过将类型放在手头,但使用它来负担程序员定义函数指针的负担,这似乎不必要:)

Jarod42解决了使用宏和decltype运算符的问题,而我完全忘记了。

您的示例Jarod42有一个小问题。

#define TCl_T(type_t, function) Tcl<type_t, decltype(function), function>

生成错误: 错误C1001:编译器中发生内部错误。

这解决了。

#define TCl_T(type_t, function) Tcl<type_t, decltype(&function), function>

显然,我们必须指定它是一个指针。

再次感谢您的帮助!

附:

template <typename type_t, typename ret_t, ret_t f(size_t, size_t)>
class TCl;

您可以使用宏:

#define TCl_T(type_t, function) Tcl<type_t, decltype(function(0, 0)), function>

然后像这样使用它:

// bool my_func(size_t, size_t);
TCl_T(int, my_func) tcl; // tcl is a Tcl<int, bool, my_func>

如果将TCl更改为:

template <typename type_t, typename prototype_t, prototype_t f>
class TCl;

您可以使用宏:

#define TCl_T(type_t, function) Tcl<type_t, decltype(function), function>

只需将模板参数放在同一行即可:

template <typename type_t, typename func, func f>
class TCl
{
    ...
};

而且,我将更喜欢类似原始示例中的示例,在该示例中,我指定了func类型,而不必担心指定返回类型。

好的,只需执行此操作即可! :-)我不明白为什么您从将整个函数类型作为模板参数传递到将其拆分为返回类型和参数类型。 并且,在这样做时,您介绍了您陈述的问题。 但是您没有解释为什么要进行此更改。

为什么不简单:

template <typename type_t, typename func_t, func_t f>
class TCl
{
    // ...
};

这是您自己方法的逻辑演变,不是吗?

这是一个有效的示例:

#include <iostream>

template <typename type_t, typename func_t, func_t f>
struct T
{
    T() { f(); }

    type_t a;   /**< Irrelevant here, but gives your `type_t` something to do */
};

void foo() { std::cout << "A\n"; }
int  bar() { std::cout << "B\n"; return 0; }

int main()
{
    T<int, void(*)(), &foo> t1;
    T<int, int (*)(), &bar> t2;
}

// Output:
//  A
//  B

现场演示

可惜您不能在template-argument-list中使用更多的推论。 Jarod42提出了一个宏宏的有趣构想,以缩短调用时间,尽管我不确定它是否可以改善外观。

我想知道这是否意味着您的主张:

使函数成为类模板参数之一,使其更易于使用

是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM