如何将向量中的可变参数转换为它是参数的持有者?
How to convert variadic in the vector to it was a holder of arguments?
我找到了this solution。它有效,但我想我的 class 是参数的所有者。我有下一个代码:
template <class val_t>
class exp_t {
public:
exp_t() {}
virtual ~exp_t() {}
virtual bool is(const std::vector<val_t> &kb) const = 0;
};
template <class val_t>
class fact_t: exp_t<val_t> {
public:
const val_t m_value;
fact_t(const val_t value): m_value{value} {}
virtual bool is(const std::vector<val_t> &kb) const {
return std::find(kb.begin(), kb.end(), m_value) != kb.end();
}
};
template <class val_t>
class not_t: public exp_t<val_t> {
exp_t<val_t> m_exp;
public:
not_t(exp_t<val_t> exp): exp_t<val_t>(), m_exp{exp} {}
virtual bool is(const std::vector<val_t> &kb) const override {
return !m_exp.is(kb);
}
};
template <class val_t, class ... args_t>
class and_t: public exp_t<val_t> {
std::vector<exp_t<val_t>> m_exps;
public:
and_t(args_t... exps) : exp_t<val_t>(), m_exps{{exps...}} {}
virtual bool is(const std::vector<val_t> &kb) const override {
for (auto &exp : m_exps) {
if (!exp.is(kb)) { return false; }
}
return true;
}
};
我需要我可以写一个像下面这样的东西:
exp_t<int> *get_exp() {
return new and_t<int>(fact_t<int>(5), fact_t<int>(6));
}
即我可以 return 我的 exp_t
并且它保存了传递的参数(例如使用移动语义,我知道如何使 classes 可移动,但我不知道如何重写 and_t
构造函数传递它并转换为 std::vector
).
如何更改我的 class and_t
?在 C++ 中可能吗?
P.S. 我试图自己阅读有关可变参数的内容,但我什么都不懂。
I.e. to I could return my exp_t and it saved passed arguments (for example using move semantic, I know how to make classes movable, but I don't know how to rewrite and_t constructor to pass it and convert to the std::vector)
如果您知道(如果您确定)所有参数都是右值,则可以使用如下移动语义
and_t (args_t && ... exps)
: exp_t<val_t>(), m_exps{{std::move(exps)...}}
{ }
否则(如果一些参数可以是右值,一些是左值),你可以使用完美转发
template <typename ... Args>
and_t (Args && ... exps)
: exp_t<val_t>(), m_exps{{std::forward<Args>(exps)...}}
{ }
因此您移动右值并复制左值。
我想最好的方法是第二种(完美转发)所以不需要 args_t
and_t
class.
的可变类型列表
我找到了this solution。它有效,但我想我的 class 是参数的所有者。我有下一个代码:
template <class val_t>
class exp_t {
public:
exp_t() {}
virtual ~exp_t() {}
virtual bool is(const std::vector<val_t> &kb) const = 0;
};
template <class val_t>
class fact_t: exp_t<val_t> {
public:
const val_t m_value;
fact_t(const val_t value): m_value{value} {}
virtual bool is(const std::vector<val_t> &kb) const {
return std::find(kb.begin(), kb.end(), m_value) != kb.end();
}
};
template <class val_t>
class not_t: public exp_t<val_t> {
exp_t<val_t> m_exp;
public:
not_t(exp_t<val_t> exp): exp_t<val_t>(), m_exp{exp} {}
virtual bool is(const std::vector<val_t> &kb) const override {
return !m_exp.is(kb);
}
};
template <class val_t, class ... args_t>
class and_t: public exp_t<val_t> {
std::vector<exp_t<val_t>> m_exps;
public:
and_t(args_t... exps) : exp_t<val_t>(), m_exps{{exps...}} {}
virtual bool is(const std::vector<val_t> &kb) const override {
for (auto &exp : m_exps) {
if (!exp.is(kb)) { return false; }
}
return true;
}
};
我需要我可以写一个像下面这样的东西:
exp_t<int> *get_exp() {
return new and_t<int>(fact_t<int>(5), fact_t<int>(6));
}
即我可以 return 我的 exp_t
并且它保存了传递的参数(例如使用移动语义,我知道如何使 classes 可移动,但我不知道如何重写 and_t
构造函数传递它并转换为 std::vector
).
如何更改我的 class and_t
?在 C++ 中可能吗?
P.S. 我试图自己阅读有关可变参数的内容,但我什么都不懂。
I.e. to I could return my exp_t and it saved passed arguments (for example using move semantic, I know how to make classes movable, but I don't know how to rewrite and_t constructor to pass it and convert to the std::vector)
如果您知道(如果您确定)所有参数都是右值,则可以使用如下移动语义
and_t (args_t && ... exps)
: exp_t<val_t>(), m_exps{{std::move(exps)...}}
{ }
否则(如果一些参数可以是右值,一些是左值),你可以使用完美转发
template <typename ... Args>
and_t (Args && ... exps)
: exp_t<val_t>(), m_exps{{std::forward<Args>(exps)...}}
{ }
因此您移动右值并复制左值。
我想最好的方法是第二种(完美转发)所以不需要 args_t
and_t
class.