我很好奇是否有一种技术允许用户轻松配置对传递给函数的对象的访问。具体来说,是否有一种编写类+函数的技术,以便它们支持任何形式的访问参数,无论是复制,引用,指针还是智能指针?
例如,假设我有一个简单的函数increment()
// direct increment
template<typename T>
void increment(T obj){
obj++;
}
increment()
适用于既是副本又是对象引用的参数,但不适用于指针或智能指针。
当然,我可以使用基于指针的版本重载increment()
,如下所示:
// pointer increment
template<typename T>
void increment(T obj){
(*obj)++;
}
但是我必须实现两次每个函数,或者提供一个调用引用版本的指针版本包装器。
或者我甚至可以将增量实现为仿函数:
// functor increment
template <typename T>
struct increment {
increment(T& obj):m_obj(obj){}
operator()(){ m_obj++; }
T& m_obj;
}
当然,可以通过将functor increment()
应用于boost::bind()
来模仿direct increment()
。如果它是通过对对象的引用实现的,那么用户必须进一步了解对引用问题的引用,尽管可以通过明智地应用boost::call_traits
来避免引用。
显而易见的答案是,用户可以调用* obj并将对obj的引用传递给direct increment()
,但是它们将失去对对象生命周期重要且有用的引用计数功能,尤其是{{1可以在线程场景中调用。这同样适用于将&amp; obj传递给increment()
,因为用户可能具有pointer increment()
更可取的特定情况。用户可能会在任何一种情况下都编写一个代理对象来包装他们真正想要的功能,但这对于我希望可以通过函数实现者解决的问题来说似乎有些过分。
请记住,这是一个简化示例,用于说明函数如何处理访问权限并允许用户在其特定问题域中利用该功能。
那么,有没有什么方法可以在一个软件包中获得优雅,快速和富有表现力的C ++,或者我仍然坚持选择任何两个?也许有可能使用模板元编程?如果没有概括,哪种设计选择更优越?
注意:以下是我正在设计的更具体的问题:https://stackoverflow.com/q/10097473/99379