簡體   English   中英

C ++模板編程 - 延遲函數調用

[英]C++ template programming - Deferred function calls

我正在尋找一個優雅的解決方案來解決以下問題。 我有一個用於延遲函數調用的任務結構。

template <typename T> struct Task1
{
    T Arg1;
    Delegate<T> TaskDelegate;
};

我遇到的問題是:

Task1<const Foo&> MyTask;

這將導致參數保持為const引用。 有沒有人知道一個很好的解決方案來繞過這個? 我可以強制執行規則,例如委托簽名總是采用const和params,但這似乎是限制性的。 我總是可以有兩個任務結構(一個用於ref,一個用於值)但這看起來很討厭。

另一種解決方案是創建以下內容:

template <typename T1, typename T2> struct Task1
{
    T2 Arg1;
    Delegate<T1> TaskDelegate;
};

無論如何,默認T2與T1的類型相同嗎? 這樣,每當我有方法值簽名時,我都不需要額外的模板參數。

編輯:該模板用於多線程任務調度程序。 這是一個例子:

void MyClass::Populate(const std::string& instrText);

CTaskScheduler::Schedule(Task1<const std::string&>(this, &MyClass::Popluate, "MyString"));

您可以在boost或即將推出的標准中查看function<>的實現。 事實上,你可以使用 function<> 我認為那里的解決方案(在C ++ 0x之前)總是存儲參數的副本,如果用戶想要引用語義,他們可以使用引用包裝器

至於如何獲取值,您可以查看一些簡單的元函數來刪除const&

// Remove reference:
template <typename T>
struct remove_reference {
   typedef T type;
};
template <typename T>
struct remove_reference<T&> {
   typedef T type;
};

同樣的const

您可以使用boost.type_traits庫來使用boost::remove_const刪除參數的常量。

除了boost :: type_traits之外,還有一個專門用於處理這類問題的boost :: call_traits庫 它還提供了避免引用引用問題的機制。

在這種情況下, boost :: remove_const可以幫助你:

template <typename T> struct Task1
{
    typename boost::remove_const<T>::type Arg1;
    Delegate<T> TaskDelegate;
};

或者,如果對const類型使用模板特化,則可以避免使用boost:

template <typename T> struct Task1
{
    T Arg1;
    Delegate<T> TaskDelegate;
};

template <typename T> struct Task1<const T>
{
    T Arg1;
    Delegate<const T> TaskDelegate;
};

(警告:未經測試)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM