将常量文字数组传递给函数而不将其声明为变量
passing a constant literal array into a function without declaring it as a variable
我有一个 class 表示一个值,并且可以假设单个数字、单个字符串、值数组或键值对映射的值。
这是当前的定义:
class Foo {
public:
typedef enum { STRING, NUMBER, ARRAY, MAP } data_type;
struct str_less {
bool operator()(const char *a, const char *b) const {
return strcmp(a,b)<0;
}
};
inline Foo(int n):type(NUMBER),number_value(n) { }
inline Foo(double n):type(NUMBER),number_value(n) { }
inline Foo(const char *s):type(STRING),string_value(s) { }
inline Foo(const std::initializer_list<std::pair<const char *const,Foo>> &arg):type(MAP),map_value(arg) { }
template<size_t N> inline Foo(const Foo (&arg)[N]):type(ARRAY) { std::copy(&arg[0], &arg[N], std::back_inserter(arg)); }
inline Foo(const std::vector<Foo> &arg):type(ARRAY),array_value(arg) { }
private:
data_type type;
double number_value = 0;
const char *string_value = "";
std::vector<Foo> array_value;
std::map<const char *,Foo, str_less> map_value;
};
我只对从编译时给定的值实例化这个 class 感兴趣...出于我的目的,它永远不会在 运行 时以变量作为参数调用。
由于 Foo
中的构造函数,在编译时指定的任何文字值都会自动类型转换为 Foo
,然后我可以在几乎 json 中指定文字]-like方式如:
Foo({
{"number_key", 100},
{"array_key", std::vector<Foo>
{1, 3, 4,
{
{"inner_key", "value"},
{"second_key", 500}}, "abc"}}});
然而,如您所见,需要注意的是我似乎需要显式转换为 std::vector 以支持数组类型。 C++11 中有什么方法可以将某种类型的文字数组传递给函数,以便我可以适当地调用 template<size_t N> Foo::Foo(const Foo (&arg)[N])
吗?我非常喜欢这个,因为要求显式向量转换感觉很尴尬,而且与自动转换其类型的其他构造函数绝对不是同质的。请问有没有其他的方法可以利用智能自动类型转换更统一简洁?
我以前见过这样的代码:
template<std::size_t N> void do_stuff(const char (&str)[N]) ...
它可以用字符串文字调用,所以从概念上讲,该机制似乎存在用于理解编译时文字数组,但是有什么方法可以指定类型的常量数组other 比 char
?
像这样的东西应该可以工作:
template <typename... Args>
Foo(Args&&... args) :
array_value{Foo(std::forward<Args>(args))...}
{}
Foo foo(4.2, "hello");
我有一个 class 表示一个值,并且可以假设单个数字、单个字符串、值数组或键值对映射的值。
这是当前的定义:
class Foo {
public:
typedef enum { STRING, NUMBER, ARRAY, MAP } data_type;
struct str_less {
bool operator()(const char *a, const char *b) const {
return strcmp(a,b)<0;
}
};
inline Foo(int n):type(NUMBER),number_value(n) { }
inline Foo(double n):type(NUMBER),number_value(n) { }
inline Foo(const char *s):type(STRING),string_value(s) { }
inline Foo(const std::initializer_list<std::pair<const char *const,Foo>> &arg):type(MAP),map_value(arg) { }
template<size_t N> inline Foo(const Foo (&arg)[N]):type(ARRAY) { std::copy(&arg[0], &arg[N], std::back_inserter(arg)); }
inline Foo(const std::vector<Foo> &arg):type(ARRAY),array_value(arg) { }
private:
data_type type;
double number_value = 0;
const char *string_value = "";
std::vector<Foo> array_value;
std::map<const char *,Foo, str_less> map_value;
};
我只对从编译时给定的值实例化这个 class 感兴趣...出于我的目的,它永远不会在 运行 时以变量作为参数调用。
由于 Foo
中的构造函数,在编译时指定的任何文字值都会自动类型转换为 Foo
,然后我可以在几乎 json 中指定文字]-like方式如:
Foo({
{"number_key", 100},
{"array_key", std::vector<Foo>
{1, 3, 4,
{
{"inner_key", "value"},
{"second_key", 500}}, "abc"}}});
然而,如您所见,需要注意的是我似乎需要显式转换为 std::vector 以支持数组类型。 C++11 中有什么方法可以将某种类型的文字数组传递给函数,以便我可以适当地调用 template<size_t N> Foo::Foo(const Foo (&arg)[N])
吗?我非常喜欢这个,因为要求显式向量转换感觉很尴尬,而且与自动转换其类型的其他构造函数绝对不是同质的。请问有没有其他的方法可以利用智能自动类型转换更统一简洁?
我以前见过这样的代码:
template<std::size_t N> void do_stuff(const char (&str)[N]) ...
它可以用字符串文字调用,所以从概念上讲,该机制似乎存在用于理解编译时文字数组,但是有什么方法可以指定类型的常量数组other 比 char
?
像这样的东西应该可以工作:
template <typename... Args>
Foo(Args&&... args) :
array_value{Foo(std::forward<Args>(args))...}
{}
Foo foo(4.2, "hello");