使用特定参数

时间:2017-01-12 11:12:52

标签: c++ c++11

我有这个结构:

struct A {
    A(int a, bool b):a(a), b(b) {};
    int a;
    bool b;
}

我可以以某种方式声明具有特定参数的特定构造函数调用的类型声明吗?

我的意思是,类似的东西:

typedef A(2, false) A_2_false;

所以我可以按如下方式使用它:

const A a_func() { return A_2_false; };
  • 它提醒std::bind您调用函数的位置,可以预先设置一些变量而不是std::place_holders

  • 我尝试使用std::integral_constant但没有运气。

  • 我不想使用#define

由于

---更新---

我想要实现的目标:

我正在写一个回调函数:
typedef std::function<const A()> CbFunc
简单用户应使用CbFunc并返回const A。 我想让事情更简化,所以用户回调函数可以是:

const A userCbFunc() {
    ...
    ...
    // Good thing happend
    return A_2_false;
    ...
    ...
    // Bad thing happend
    return A(99, true);
}

我希望Good thing happened返回类型更加简化,因此A_2_false代替A(2, false)

然后,我在函数返回时使用struct成员。

6 个答案:

答案 0 :(得分:5)

只需一个简单的函数即可:

A A_2_false() { return A(2, false); }

用法:

A a_func()
{
    return A_2_false();
}

即使这正式需要几份副本,所有副本都有资格进行复制,因此这段代码可以像原始代码一样有效地翻译。 C ++ 17甚至强制要求使用此副本。

如果从A_2_false的设计角度理解这一点,您还可以使A成为A的静态成员函数:

struct A
{
    static A two_false() { return A(2, false); }

    // ...
};


A a_func()
{
    return A::two_false();
}

这有时被称为&#34;命名构造函数&#34;成语。

答案 1 :(得分:2)

如何使用lambda函数

auto A_2_false = []() { return A(2, false); };

然后使用

调用它
A myA = A_2_false();

答案 2 :(得分:2)

lambda

怎么样?
#include <iostream>
struct A {
    A(int a, bool b):a(a), b(b) {};
    int a;
    bool b;
};

auto make_A_default = []
{
    return A(2, false);
};

A a_func()
{
    return make_A_default();
}

int main() 
{
    auto a = a_func();
    a.a = 5;
}

答案 3 :(得分:2)

一种简单的方法是制作副本:

const A A_2_false(2, false); // a global, reusable instance

A a_func() {
    return A_2_false;
};

答案 4 :(得分:1)

试试这个

 struct A {
    A(int a=2, bool b=true):a(a), b(b) {};
      int a;
      bool b;
    }

答案 5 :(得分:1)

模板可能会有所帮助。

#include <iostream>
#include <string>

template <int I, bool B>
struct A {
    int i = I;
    bool b = B;

    static const A construct() { return {I, B}; }
};

int main()
{
    using Type = A<2, false>;

    std::cout << Type::construct().i << std::endl;
    std::cout << Type::construct().b << std::endl;

    return 0;
}