小编mpa*_*ark的帖子

实现这个"错误,抛出"回调的最佳方法是什么?

请注意:在我们得到真正的问题之前,这里有很多背景信息.

我有一个相当宽的C++类层次结构(表示类似不同类型的表达式):

class BaseValue { virtual ~BaseValue(); };
class IntValue final : public BaseValue { int get() const; };
class DoubleValue final : public BaseValue { double get() const; };
class StringValue final : public BaseValue { std::string get() const; };
Run Code Online (Sandbox Code Playgroud)

而另一方面,我有办法强制用户的输入到预期的类型:

class UserInput { template<class T> get_as() const; };
Run Code Online (Sandbox Code Playgroud)

因此,编写匹配器的一种方法是"用户的输入是否等于此BaseValue的值?" - 会是这样的:

class BaseValue { virtual bool is_equal(UserInput) const; };
class IntValue : public BaseValue {
    int get() const;
    bool is_equal(UserInput u) const override {
        return u.get_as<int>() == get(); …
Run Code Online (Sandbox Code Playgroud)

c++ exception visitor template-meta-programming c++14

5
推荐指数
1
解决办法
202
查看次数

std :: decay和pass-by-value之间有什么区别?

的规格std::decayN4296叶子下面的注释:

[注意:当左值表达式用作右值时,此行为类似于左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)转换,但也从类类型剥离cv-qualifiers ,以便更接近地模拟按值参数传递. - 结束说明]

在我看来,理想std::decay将由值参数传递模型准确,但由于某种原因它没有定义方式.

我认为它可以用模板参数推导来定义,在这种情况下,实现也可以定义为利用模板参数推导来精确地模拟按值参数传递.

template <typename T>
struct decay {
  private:

  template <typename U>
  static U impl(U);

  public:

  using type = decltype(impl(std::declval<T>()));
};
Run Code Online (Sandbox Code Playgroud)

问题:

  1. std::decay和值之间的差异有什么区别?
  2. 是否std::decay 设计为不模拟按值传递的参数?
  3. 上面的实现是否会完全模拟它?

c++ c++11

2
推荐指数
1
解决办法
413
查看次数