有没有办法使用增强信号和插槽与不可复制的对象?

时间:2017-01-17 14:14:06

标签: c++ boost

我想将不可复制的对象传递给boost信号。请参阅下面的代码(不编译)。有可能的解决方法吗?

public class RedeemFragment extends Fragment {

    //DatePicker picker;
    //Button displayDate;
    //TextView textview1;
    @Bind(R.id.editText1)
    EditText _sirText;
    @Bind(R.id.editText2)
    EditText _FirstText;
    @Bind(R.id.editText3)
    EditText _MidText;
    @Bind(R.id.editText4)
    EditText _LastText;
    @Bind(R.id.btn1)
    Button _detailsButton;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         View v = inflater.inflate(R.layout.profile, container, false);


        Button b1 = (Button)v.findViewById(R.id.btn1);

        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(),SendInfo.class);
                intent.putExtra("sname", _sirText.getText().toString());
                intent.putExtra("fname", _FirstText.getText().toString());
                intent.putExtra("mname", _MidText.getText().toString());
                intent.putExtra("lname", _LastText.getText().toString());
                startActivity(intent);

                details();
            }
        });

        return v;
        /*textview1=(TextView)findViewById(R.id.textView1);
        picker=(DatePicker)findViewById(R.id.datePicker);
        displayDate=(Button)findViewById(R.id.pickDate);

        textview1.setText(getCurrentDate());

        displayDate.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                textview1.setText(getCurrentDate());
            }

        });*/
    }
    /*public String getCurrentDate(){
        StringBuilder builder=new StringBuilder();
        builder.append("Current Date: ");
        builder.append((picker.getMonth() + 1)+"/");//month is 0 based
        builder.append(picker.getDayOfMonth()+"/");
        builder.append(picker.getYear());
        return builder.toString();
    }*/


    public void details() {

        if (!validate()) {
            onDetailIncorrect();
            return;
        }

        _detailsButton.setEnabled(false);


        new android.os.Handler().postDelayed(
                new Runnable() {
                    public void run() {
                        // On complete call either onLoginSuccess or onLoginFailed
                        onDetailCorrect();
                        // onLoginFailed();
                    }
                }, 3000);
    }

    public void onDetailCorrect() {
        _detailsButton.setEnabled(true);
        onDestroy();
    }
    public void onDetailIncorrect() {
        Toast.makeText(getActivity(), "Fill in the blanks appropriately !!", Toast.LENGTH_LONG).show();

        _detailsButton.setEnabled(true);
    }

    public boolean validate() {
        boolean valid = true;

        String sir = _sirText.getText().toString();
        String first = _FirstText.getText().toString();
        String mid = _MidText.getText().toString();
        String last = _LastText.getText().toString();

        if (sir.isEmpty()) {
            _sirText.setError("enter Sir name");
            valid = false;
        } else {
            _sirText.setError(null);
        }

        if (first.isEmpty()) {
            _FirstText.setError("enter First Name");
            valid = false;
        } else {
            _FirstText.setError(null);
        }
        if (mid.isEmpty()) {
            _MidText.setError("enter Middle Name");
            valid = false;
        } else {
            _MidText.setError(null);
        }

        if (last.isEmpty()) {
            _LastText.setError("enter Last Name");
            valid = false;
        } else {
            _LastText.setError(null);
        }

        return valid;
    }
}

1 个答案:

答案 0 :(得分:3)

更新我误解了这个问题。您不希望处理程序类型本身不可复制,而是它们的参数。

答案是:不,信号2不是移动感知的。

注意通常,您不应该遇到这种情况,因为许多连接可以订阅同一个插槽,您只能从参数移动一次。很可能,你最好传递一个copy / const引用:

#include <boost/signals2.hpp>
#include <iostream>
#include <memory>

struct MySlot
{
    void operator()(std::unique_ptr<int> const& input) const
    {
        std::cout << "Signaled " << *input.get();
    }
};

int main()
{
    boost::signals2::signal<void(std::unique_ptr<int> const&)> signal;

    signal.connect(MySlot());

    auto ptr = std::make_unique<int>(20);
    signal(ptr);
}

您可以使用常用方法:

旧答案:

使用std::refstd::cref

这些包装器透明地转发函数调用操作符。

确保不可复制的可调用的生命周期超过连接的生命周期的责任在于你。

创建自己的生命周期包装

您可以创建一个可调用的对象包装器来存储不可复制的对象,并转发函数调用操作符,如std::reference_wrapper<>所做的那样。但是,这一次,您可以将对象存储为shared_ptr<>,以便自动管理生命周期。