http://coliru.stacked-crooked.com/view?id=b694c6cc3a52e0c14bedd6a26790d99d-e54ee7a04e4b807da0930236d4cc94dc
這是可以做到,如果不好。我建議不要這樣做。基本上,關鍵部分是因爲你不能有一個指針或一個位域的引用,而是使用lambda它爲你設置位域。
我不喜歡宏,就像下一個人一樣,但它是我能想到的唯一方法,以避免要求調用者在調用站點放入lambda表達式。
template<class assigner_type>
struct bitfieldref_type {
bitfieldref_type(bool value, assigner_type&& assign) :value(value), assign(std::move(assign)) {}
operator bool() const {return value;}
bitfieldref_type& operator=(bool v) {assign(v); value=v; return *this;}
private:
bool value;
assigner_type assign;
};
template<class assigner_type>
bitfieldref_type<assigner_type> make_bitfieldref(bool value, assigner_type&& assign)
{return {value, std::move(assign)};}
//macro is optional
#define bitfieldref(X) make_bitfieldref(X, [&](bool v)->void{X=v;})
用法:
template <class T, typename... Args> void proof_it_works(T&& first)
{first = 0;}
template <class T, typename... Args> void proof_it_works(T&& first, Args &&...args) {
first = 0;
proof_it_works(std::forward<Args>(args)...);
}
template <typename... Args> void f(Args &&...args) {proof_it_works(std::forward<Args>(args)...);}
int main() {
struct bits { unsigned int foo:1; };
bits b{1};
int a = -1;
float c = 3.14;
f(a, bitfieldref(b.foo), c);
std::cout << a << b.foo << c;
return 0;
}
我只注意到我bitfieldref_type
假設值是bool
,而不是unsigned int
,但我會離開固定,作爲對用戶的練習吧。
有辦法,但我認爲_best_選項是不能傳遞位域的。 –
@MooingDuck謹慎添加答案以顯示一些變通方法?直接的做法失敗 – TemplateRex
@MooingDuck花式在這裏看到你:)。我開始走這條路,就像在通話時加入演員一樣簡單。不是很棒,但也不錯。 – s4y