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

标签 c++ templates reference

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

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

我遇到的问题是:

Task1<const Foo&> MyTask;

这将导致参数被保存为常量引用。有谁知道一个很好的解决方案来解决这个问题?我可以强制执行诸如委托(delegate)签名始终采用 const& 参数之类的规则,但这似乎具有限制性。我总是可以有两个任务结构(一个用于引用,一个用于值),但这看起来很讨厌。

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

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"));

最佳答案

你可以看看 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 .

关于C++ 模板编程 - 延迟函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7124614/

相关文章:

C++ MFC MDI 在创建时更改子窗口变量

c++ - 模板递归区分 boot::tuple 中的数据类型

c++ - 具有函数模板的递归函数

c++ - 比较运算符重载,为什么编译器不做这项工作?

c# - Interop.xxxxx.dll 是如何生成的?

perl - 如何引用 Perl 中的数组切片?

c++ - 引用成员是好的做法吗?是常量成员吗?

java - java hashmaps 的 get() 函数

c++ - 使用可变参数模板解包参数列表时获取参数索引

c++ - 如何为各种高度相似的类型创建通用函数?