C++模板编程 - 延迟函数调用

Dow*_*nie 4 c++ templates reference

我正在寻找一个优雅的解决方案来解决以下问题.我有一个用于延迟函数调用的任务结构.

template <typename T> struct Task1
{
    T Arg1;
    Delegate<T> TaskDelegate;
};
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是:

Task1<const Foo&> MyTask;
Run Code Online (Sandbox Code Playgroud)

这将导致参数保持为const引用.有没有人知道一个很好的解决方案来绕过这个?我可以强制执行规则,例如委托签名总是采用const和params,但这似乎是限制性的.我总是可以有两个任务结构(一个用于ref,一个用于值)但这看起来很讨厌.

另一种解决方案是创建以下内容:

template <typename T1, typename T2> struct Task1
{
    T2 Arg1;
    Delegate<T1> TaskDelegate;
};
Run Code Online (Sandbox Code Playgroud)

无论如何,默认T2与T1的类型相同吗?这样,每当我有方法值签名时,我都不需要额外的模板参数.

编辑:该模板用于多线程任务调度程序.这是一个例子:

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

CTaskScheduler::Schedule(Task1<const std::string&>(this, &MyClass::Popluate, "MyString"));
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 8

你可以看一下function<>boost或即将推出的标准的实现.事实上,你可以使用 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;
};
Run Code Online (Sandbox Code Playgroud)

同样的const.