c ++声明一个存储在string中的数据类型的字节数组

时间:2016-03-31 10:46:29

标签: c++

我有一个以字符串形式存储的数据类型名称。 使用该字符串,我可以声明该数据类型的变量。

实施例,

string s = 'int';

我想创建一个int的字节数组。

有没有办法在C ++中做到这一点?

2 个答案:

答案 0 :(得分:2)

  

使用该字符串,我可以声明该数据类型的变量。

没有。 C ++是一种静态类型语言,字符串不是常量表达式。

但是,您可以声明类型为temp的变量,并根据字符串的内容有条件地使用它:

template<typename T>
T foo(T t){
    T temp{};
    [&temp]() -> void { 
        temp++; 
    }();
    return temp;
}

作为旁注:int是无效的字符文字;你的意思可能是int foo; if(str == "int") // use foo here

答案 1 :(得分:0)

最新版本的boost :: variant,std :: regex和c ++ 14为我们提供了:

#include <iostream>
#include <string>
#include <boost/variant.hpp>
#include <iomanip>
#include <regex>
#include <stdexcept>
#include <exception>
#include <sstream>

struct variant_value
{
    static auto evaluate(const std::string& s)
    {
        static const std::regex syntax(R"regex((.*)\((.*)\))regex");
        std::smatch result;
        if (std::regex_match(s, result, syntax))
        {

            if (result[1].str() == "int")
            {
                return variant_type(int(std::stoi(result[2].str())));
            }
            if (result[1].str() == "string")
            {
                std::stringstream ss(result[2].str());
                std::string rs;
                ss >> std::quoted(rs, '\'');
                return variant_type(rs);
            }
            if (result[1].str() == "float" || result[1].str() == "double")
            {
                return variant_type(std::stod(result[2].str()));
            }
        }
        throw std::invalid_argument(s);
    }

    variant_value(const std::string& s)
    : _vnt(evaluate(s))
    {}

    template<class F>
    decltype(auto) visit(F&& f) {
        return boost::apply_visitor(std::forward<F>(f), _vnt);
    }

    using variant_type = boost::variant<std::string, int, double>;



    variant_type _vnt;
};

// now test
int main()
{
    auto a = variant_value("string('hello world')");
    auto b = variant_value("int(10)");
    auto c = variant_value("float(6.43)");

    auto print = [](const auto& x) { std::cout << x << std::endl; };

    a.visit(print);
    b.visit(print);
    c.visit(print);

    return 0;
}

预期产出:

hello world
10
6.43