Was ist ein callable object in C++?
Ich bin derzeit Studium der boost-threads. Und ich stieß auf, dass die thread-Klasse hat einen Konstruktor akzeptiert callable objects. Was sind aufrufbare Objekte?
class CallableClass
{
private:
//Number of iterations
int m_iterations;
public:
//Default constructor
CallableClass()
{
m_iterations=10;
}
//Constructor with number of iterations
CallableClass(int iterations)
{
m_iterations=iterations;
}
//Copy constructor
CallableClass(const CallableClass& source)
{
m_iterations=source.m_iterations;
}
//Destructor
~CallableClass()
{
}
//Assignment operator
CallableClass& operator = (const CallableClass& source)
{
m_iterations=source.m_iterations;
return *this;
}
//Static function called by thread
static void StaticFunction()
{
for (int i=0; i < 10; i++) //Hard-coded upper limit
{
cout<<i<<"Do something in parallel (Static function)."<<endl;
boost::this_thread::yield(); //'yield' discussed in section 18.6
}
}
//Operator() called by the thread
void operator () ()
{
for (int i=0; i<m_iterations; i++)
{
cout<<i<<" - Do something in parallel (operator() )."<<endl;
boost::this_thread::yield(); //'yield' discussed in section 18.6
}
}
};
Wie funktioniert dies ein callable-Objekt? Ist es, weil der Betreiber überlastet oder der Konstruktor oder etwas anderes?
- Es ist, weil
operator()
, ja. Siehe hier. Neben "callable objects" in diesem Kontext ist auch, Funktionen, function-Pointer und lambda-Funktionen. - Es ist die überladene
operator()
. Es können Sie rufen Sie eine Instanz der Klasse wie eine Funktion. Sie heißen funktoren, die Funktion von Objekten, callable objects, etc. - Sollten Sie die tag-Nummer (und name) diese Frage mit boost. Boost ist nicht zu standard-C++ - Bibliothek, also das ganz große boost-community hier in der Lage sein könnte, um diesen pick-up schneller, wenn Sie getaggte und benannte Sie richtig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein aufrufbares Objekt ist etwas, das genannt werden kann, wie eine Funktion, mit der syntax
object()
oderobject(args)
; das heißt, dass ein Funktionszeiger oder ein Objekt einer Klasse geben, die überlastungenoperator()
.Überlastung der
operator()
in Ihrer Klasse macht Sie aufrufbar.Gibt es zwei Schritte hier. In der C++ - Standard, eine "Funktion " Objekt" ist ein Objekt, das eingeblendet werden kann, auf der linken Seite eine eingeklammerte Liste von Argumenten, die ich.e, wird ein Zeiger auf die Funktion oder ein Objekt, dessen Typ hat eine oder mehrere
operator()
s. Der Begriff "callable-Objekt" ist breiter: es enthält auch Zeiger auf member (die nicht aufgerufen werden kann, mit die normale Funktionsaufruf-syntax). Callable objects sind die Dinge, die übergeben werden kann, umstd::bind
etc. Sehen 20.8.1 [func.def] und 20.8[function.Objekte]/1.Ein Objekt hat mindestens eine überladene
operator()
ist ein callable-Objekt, und dass Betreiber und seine Objekt aufgerufen werden können wie Funktion aufrufen:operator()
ist ein callable-Objekt-ich bin einfach nicht bestimmter das Gegenteil ist wahr.Ein callable-Objekt ist ein Objekt Instanz von einer Klasse mit
operator()
überlastet:oder ein dereferenzierter-Funktion Zeiger:
f(3)
. Nicht in die details, ob eine Funktion Zeiger muss aufgelöst werden.(*******f)(3)
, wof
ist eine Funktion, die Zeiger gültig ist.Da C++17, ein Aufrufbares Objekt ist, definiert der standard; siehe https://en.cppreference.com/w/cpp/named_req/Callable für details.
In C++11, ein callable-element kann entweder:
Dies bedeutet, dass Sie verwenden können, jedes der genannten aufrufbaren Elemente zum Start eines std::thread. Werfen Sie einen Blick auf die folgenden Beispiel-code:
Funktion Objekt hinzufügen-member-Funktion-Zeiger ergibt was sind bekannt as callable objects.
Wenn wir in c++ 98/03,verwenden wir die Klasse überschreiben der operator() als Funktion.Im Allgemeinen nennen wir das eine Klasse Funktion.Es hat den Vorteil der Speicherung Status der Funktion und in der anderen Funktion nicht.So ist es das wichtigste Konzept.Und die Grenze, wir nennen diese style-Klasse-Funktion und die andere c-Stil-Funktion und Zeiger auf c-Stil-Funktion "function-Objekt".
Das callable-Objekt ist nur "callable" - Objekt. Es zählen die Funktion Objekt-und member-Funktion-Zeiger.