我有一个以字符串形式存储的数据类型名称。 使用该字符串,我可以声明该数据类型的变量。
实施例,
string s = 'int';
我想创建一个int
的字节数组。
有没有办法在C ++中做到这一点?
答案 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