用字符串而不是类型

时间:2017-08-09 22:09:25

标签: c++ templates boost-variant

我想创建一个适用于多种类型的类。 然而,我想要实例化此类的元素,而不是使用类型而是使用字符串(例如,使用"int"而不是int),这样我在使用时不必进行广泛的调度程序功能这堂课。

在小班Tab上,我尝试了两个“解决方案”:

第一个:

template <typename T>
class Tab {
public :

  Tab(std::size_t length) {
    T* tab_[length];
    tab = tab_;
  }

  T* tab;

  T operator[](std::size_t i) {
    return tab[i];
  }
}; 

Tab getTab(std::string type, std::size_t length) {

    if (type == "int") {
      Tab<int> tab(length);
    } else if (type == "double") {
      Tab<double> tab(length);
    }

    return tab;
}

第二个:

typedef boost::variant<int, double> numeric;
typedef boost::variant<int*, double*> numeric_ptr;

class Tab {
public :

  Tab(std::string type, std::size_t length) {
    if (type == "int") {
      tab = new int[length];
    } else if (type == "double") {
      tab = new double[length];
    }
  }

  numeric_ptr tab;

  numeric operator[](std::size_t i) {
    return tab[i];
  }
}; 

两次尝试都不编译。我很乐意为我的问题找到一个不那么复杂的解决方案。

编辑:为什么你首先使用字符串而不是类型名?

我有许多使用模板化类的函数。在每个函数中,我可以将模板化类的类型名称知道为字符串,因此我必须使用像这样的调度函数:https://github.com/privefl/bigstatsr/blob/master/src/colstats.cpp。如果你有20个这样的函数,那么为它们中的每一个编写一个调度函数真的很烦人(并且它很容易出错)。

所以我宁愿只为一个类的实例化创建一个调度函数,并在需要这个模板化类的实例的所有函数中使用这个函数。

2 个答案:

答案 0 :(得分:5)

您可以执行以下操作:

    UPDATE my_table SET my_explanation = execute explain analyze my_table.my_query

答案 1 :(得分:2)

我不会“在字符串上模板”并在返回类型上返回变量而是返回模板。那么你可以

getTab<int>(17);

即便如此,您也不需要在您的问题中提到任何“昂贵的调度员功能”。您只需将Tab的包装类型设为模板

template < typename T >
void algorithm(Tab<T> const& t) { ... }

为了便于使用和记忆正确,我还用std::vector替换了裸指针。

#include <vector>

template <typename T>
class Tab {
  std::vector<T> tab;
public :

  Tab(std::size_t length) : tab(length) {}

  T operator[](std::size_t i) {
    return tab[i];
  }
}; 

template < typename T >
Tab<T> getTab(std::size_t length)
{
  return Tab<T>(length);
}

int main()
{
  auto ti = getTab<int>(17);
  auto td = getTab<double>(29);
}