簡體   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