我可以避免在模板实例化期间显式写出我的class-template参数类型吗?

问题描述

我写了一个名为SaveGuard的模板化RAII类,该类的构造函数复制指定对象的当前状态,然后在析构函数上从保存的状态还原该对象。这样,我可以对对象进行临时更改,并且可以保证它们将在当前作用域的末尾自动还原(请参见下面的代码)。

一切正常;我的问题是:我是否有一种方法可以避免每次声明SaveGuard时都必须显式键入要保存的对象的类型?即不要输入以下内容:

const SaveGuard<std::string> guard(myStr);

我更喜欢键入以下内容:

const SaveGuard<> guard(myStr);

由于对象的类型可能相当复杂,而且我可能在很多地方都为它声明了SaveGuard个对象,所以如果可以的话,它将节省大量的键入和代码整理工作。

但是,尝试产生此错误:

temp.cpp:23:17: error: too few template arguments for class template 'SaveGuard'
      const SaveGuard<> guard(myStr);

代码如下:

#include <iostream>
#include <string>

/** Convenience class to place on the stack for RAII-swapping of a table out to temporary storage and then back again in the destructor */
template<class T> class SaveGuard
{
public:
   SaveGuard(T & saveMe) : _saveMe(saveMe),_tempHolder(saveMe) {/* empty */}  // save the current value
   ~SaveGuard() {_saveMe = _tempHolder;}  // restore the saved value

private:
   T & _saveMe;
   T _tempHolder;
};

int main(int argc,char ** argv)
{
   std::string myStr = "foo";

   std::cout << "At point A,myStr=" << myStr << std::endl;

   {
      const SaveGuard<std::string> guard(myStr);

      // Make some temporary modifications to myStr
      myStr += "bar";
      std::cout << "At point B,myStr=" << myStr << std::endl;
   }

   std::cout << "At point C,myStr=" << myStr << std::endl;
   return 0;
}

运行时,代码将输出以下内容:

At point A,myStr=foo
At point B,myStr=foobar
At point C,myStr=foo

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)