पहले जेनेरिक मॉनीटर क्लास बनाएं। के सी ++ 11 शक्ति के साथ आप इसे के रूप में इस के रूप में सरल कर सकते हैं:
template <class F>
struct FunctionType;
template <class R, class Object, class... Args>
struct FunctionType<R (Object::*)(Args...)> {
typedef R return_type;
};
template <class R, class Object, class... Args>
struct FunctionType<R (Object::*)(Args...) const> {
typedef R return_type;
};
template <class Object_>
class Monitor {
public:
typedef Object_ object_type;
template <class F, class... Args >
typename FunctionType<F>::return_type operation(const F& f, Args... args)
{
critical_section cs;
return (object.*f)(args...);
}
template <class F, class... Args >
typename FunctionType<F>::return_type operation(const F& f, Args... args) const
{
critical_section cs;
return (object.*f)(args...);
}
private:
object_type object;
class critical_section {};
};
बेशक
critical_section
कार्यान्वयन आप पर निर्भर है। मैं पॉज़िक्स या कुछ बूस्ट की सलाह देता हूं।
यह अभी उपयोग करने के लिए तैयार है:
Monitor<std::vector<int> > v;
v.operation((void (std::vector<int>::*)(const int&)) &std::vector<int>::push_back, 1);
v.operation((void (std::vector<int>::*)(const int&)) &std::vector<int>::push_back, 2);
size = v.operation(&std::vector<int>::size);
std::cout << size << std::endl;
आप देख सकते हैं कभी कभी आप स्पष्ट रूप से राज्य के लिए आप कॉल करना चाहते जो सदस्य समारोह की आवश्यकता होगी - std :: वेक्टर <> एक से अधिक push_back है ...
compilers जो अभी भी variadic टेम्पलेट का समर्थन नहीं करते के लिए - यह नीचे के बिना समाधान - यदि आवश्यक - - यह बहुत असुविधाजनक है - मैं समय के लिए दो तर्क पर निर्भर है और अधिक तर्क के साथ समारोह जोड़ें:
template <class F>
struct FunctionType;
template <class R, class Object>
struct FunctionType<R (Object::*)()> {
typedef R return_type;
};
template <class R, class Object>
struct FunctionType<R (Object::*)() const> {
typedef R return_type;
};
template <class R, class Object, class Arg1>
struct FunctionType<R (Object::*)(Arg1)> {
typedef R return_type;
};
template <class R, class Object, class Arg1>
struct FunctionType<R (Object::*)(Arg1) const> {
typedef R return_type;
};
template <class R, class Object, class Arg1, class Arg2>
struct FunctionType<R (Object::*)(Arg1,Arg2)> {
typedef R return_type;
};
template <class R, class Object, class Arg1, class Arg2>
struct FunctionType<R (Object::*)(Arg1,Arg2) const> {
typedef R return_type;
};
template <class Object_>
class Monitor {
public:
typedef Object_ object_type;
template <class F>
typename FunctionType<F>::return_type operation(const F& f)
{
critical_section cs;
return (object.*f)();
}
template <class F>
typename FunctionType<F>::return_type operation(const F& f) const
{
critical_section cs;
return (object.*f)();
}
template <class F, class Arg1>
typename FunctionType<F>::return_type operation(const F& f, Arg1 arg1)
{
critical_section cs;
return (object.*f)(arg1);
}
template <class F, class Arg1>
typename FunctionType<F>::return_type operation(const F& f, Arg1 arg1) const
{
critical_section cs;
return (object.*f)(arg1);
}
template <class F, class Arg1, class Arg2>
typename FunctionType<F>::return_type operation(const F& f, Arg1 arg1, Arg2 arg2)
{
critical_section cs;
return (object.*f)(arg1, arg2);
}
template <class F, class Arg1, class Arg2>
typename FunctionType<F>::return_type operation(const F& f, Arg1 arg1, Arg2 arg2) const
{
critical_section cs;
return (object.*f)(arg1, arg2);
}
private:
object_type object;
class critical_section {};
};
यह मुझे कम कोड के साथ ऐसा करने की कल्पना करना मुश्किल है। आपके प्रस्तावित समाधान के लिए आवश्यक कोड क्लास (म्यूटेक्स सदस्य) और प्रत्येक फ़ंक्शन के लिए एक पंक्ति के लिए एक पंक्ति है। मुझे नहीं लगता कि यह विशिष्ट भाषा समर्थन के बिना छोटा हो जाएगा। क्या यह आपका सवाल है? यदि ऐसा है, तो जवाब है "मॉनिटर बनाने के लिए सी ++ में भाषा समर्थन नहीं है"। :) –
आप एक म्यूटेक्स का उपयोग क्यों नहीं करते हैं, यह व्यापक रूप से उपलब्ध है। अपने स्वयं के सिंक्रनाइज़ेशन प्राइमेटिव्स को खोजना बुरी तरह से बुझाने के लिए एक नाटक है। –
देखें [बूस्ट। थ्रेड] (http://www.boost.org/libs/thread/) यदि वह पर्याप्त रूप से स्पष्ट नहीं था। : -] – ildjarn