【问题标题】:decltype for class method type类方法类型的 decltype
【发布时间】:2014-09-02 10:26:23
【问题描述】:

我想将类成员函数的返回值存储在另一个类中。

这似乎有效:

class Foo
{
public: 
   Foo(int) {} //non default constructor that hides default constructor
   unspecified_return_type get_value();


};

class Bar
{
    // stores a value returned by Foo::get_value
    decltype(Foo().get_value()) value;
};

但是有对类 Foo 的默认构造函数的引用,在某些情况下可能没有定义。有什么方法可以在不显式引用任何构造函数的情况下做到这一点?

【问题讨论】:

    标签: c++ decltype


    【解决方案1】:

    是的,有。 std::declval 正是出于这个原因引入的(不需要依赖特定的构造函数):

    decltype(std::declval<Foo>().get_value()) value;
    

    【讨论】:

    • 我一直在玩它,无论如何似乎甚至 OP 的代码都没有调用默认构造函数...优化?
    • @MarcoA。不是优化。 decltype 是一个未评估的上下文(表达式仅针对其类型进行评估,但并未实际执行)。
    • 那么在这种情况下我真的需要 declval 吗?如果我只需要这种类型,我可能会在没有它的情况下逃脱
    • @MarcoA。当类没有默认构造函数(如提到的 OP)时,就会出现问题。我在他的代码示例中添加了这种情况。
    • @MarcoA。你可以侥幸逃脱。但是表达式无论如何都需要格式正确,所以如果它需要DefaultConstructible 但可能不需要,那么你需要declval,是的。
    【解决方案2】:

    您可以在std::declval 的帮助下做到这一点,如下例所示:

    #include <iostream>
    #include <utility>
    
    struct test {
      int val = 10;
    };
    
    class Foo {
    public:
       test get_value() { return test(); }
    };
    
    class Bar {
    public:
      using type = decltype(std::declval<Foo>().get_value());
    };
    
    int main() {
      Bar::type v;
      std::cout << v.val << std::endl;
    }
    

    LIVE DEMO

    std::declval&lt;T&gt; 将任何类型 T 转换为引用类型,从而可以在 decltype 表达式中使用成员函数,而无需通过构造函数。

    std::declval 常用于模板中,可接受的模板参数可能没有共同的构造函数,但具有需要返回类型的相同成员函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多