【问题标题】:c++ function returning template type checkingc++ 函数返回模板类型检查
【发布时间】:2015-07-20 19:53:12
【问题描述】:

我已经阅读了这里的一些问题,但找不到任何特定于我的问题的内容,所以我不知道我是完全错误地做错了,还是只是遗漏了一些特定的东西。

我要做的是标记一些数据并将其输入到函数中,然后根据读取的数据作为特定类型返回数据,或者如果输入验证失败则返回 bool false。我有超过 20 个 .cpp 和 20 个 .h 文件,所以我只会在此处发布相关部分,希望已经足够...

#include "utility1.h"
#include <fstream>
#include <boost/tokenizer.hpp>

using namespace std;
using namespace boost;


string buffer;

template <class T>
bool loadStaff(char* staffName) {

   ifstream staffFile;
   T data;
   int datapos = 0;

   staffFile.open(staffName, ios::in);

   if (!staffFile.is_open()) {
      cout << "Cant open file: " << staffName << endl;
      return false;
   }

   while (staffFile.good()) {
      getline(staffFile, buffer);
      tokenizer<> tok(buffer);

      for (tokenizer<>::iterator pos=tok.begin(); pos!=tok.end(); ++pos) {
         data = validate(datapos, *pos);
         //  want to type check 'data' here
      }
   }

   staffFile.close();
   return true;
}

template <class T>
T validate(int datapos, string token) {

   switch(datapos) {

   case 0:
      if (sizeof(token) != 2)
         return false;
      else 
         return token;
      break;
   }
}

那么我应该怎么做呢?铸造工作吗?还是不会,因为它可能会更改数据类型而不是检查它是什么数据类型。

对于第一次检查,我想检查 validate 是否返回 bool false 然后导致错误(稍后将更改为 try 和 catch 语句,但现在只想让它工作。

非常感谢任何帮助,在此先感谢。 :)

【问题讨论】:

  • 为什么validate 是一个模板?除了 false 或 true 之外,它会返回什么?
  • 对不起,它还没有完成,它会根据数据位置的不同,将数据作为 int 或 string 或 double 返回。如果有任何失败,它将返回 false,但如果成功,它将根据数据位置返回字符串、int、double 等。
  • 我只是把它改成了一个小例子。

标签: c++ templates types return token


【解决方案1】:

这里的问题是编译器需要在编译时知道每个表达式的类型,而你试图创建一个返回类型只在运行时知道的函数。

而是为您想要返回的所有类型创建一个基类并返回一个指向它的指针(以便虚方法起作用)。

如果您还想在验证失败时返回 bool,您可以返回例如 std::pair&lt;bool, base_token *&gt;,其中第一项表示验证是否成功,如果是,则第二项是有效指针。

【讨论】:

  • 好吧,这是有道理的,没有办法在编译时使用代码中的返回类型来强制它工作,因为那不会改变?对此表示怀疑,但如果允许的话仍然感兴趣。
  • 我不确定你的意思。
  • 我可能使用了错误的术语,但基本上让编译器根据输入的值而不是返回的值来创建函数
  • 好吧,如果函数签名相同,会产生模棱两可的函数调用。
  • 谢谢,为了做到这一点,但使用模板,我只需将令牌转换为 int / double / string 然后使用将其作为模板并返回返回 true 或 false 的函数进行验证。感谢您整理。
【解决方案2】:

不,你不能那样做。您正在尝试使模板参数 T 依赖于运行时变量 - 而模板参数必须在编译时推导出。

您可以改为使用boost::any

【讨论】:

  • boost any 是我通常使用的,但是我的讲师想要一个模板示例,所以尝试用它做类似的事情。
  • 为了帮助您,请更清楚地说明您的讲师的要求。
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多