Son birkaç günü, C++ işlev işaretçileri için genelleştirilmiş bir sarmalayıcı oluşturmaya çalıştım ve neredeyse her bir sorun çubuğunu tek tek çözmeyi başardım. Bununla temel amacım, bir nesneyi dahili olarak depolanmış bir işlev göstericisiyle bir işlev olarak basitçe çağırmaktı. İşaretçi bir yere işaret ediyorsa, boş bir işaretçi işlevi çağırmaz ve hiçbir şey olmamış gibi devam ederse normal olarak çağırır. Öncelikli olarak, işlev çağrısı yapılsaydı ve sadece bir eylemi önceden oluşturmak istediğimde umurumda olmayacak olan geri arama işlevi amaçları için kullanmayı düşünmekteyim. Aşağıdaki neredeyse mükemmel çalışıyor:C++ '...' parametre paketinin C++ şablon değeri olarak kullanılması?
template<typename T>
class Action;
template<typename TReturn, typename ... TArgs>
class Action<TReturn(TArgs...)> {
public:
//! Define a type for the Action object
typedef TReturn(*signature)(TArgs...);
//! Constructors
inline Action(const signature& pFunc = nullptr) : mPointer(pFunc) {}
inline Action(const Action& pCopy) : mPointer(pCopy.mPointer) {}
//! Operator Call
inline bool operator() (TReturn& pReturn, TArgs ... pArgs) const { if (!mPointer) return false; pReturn = mPointer(pArgs...); return true; }
//! Operators
inline Action& operator=(const Action& pCopy) { mPointer = pCopy.mPointer; return *this; }
inline Action& operator=(const signature& pFunc) { mPointer = pFunc; return *this; }
inline operator bool() const { return (mPointer != nullptr); }
private:
//! Store a pointer to the callback function
signature mPointer;
};
template<typename ... TArgs>
class Action<void(TArgs...)> {
public:
//! Define a type for the Action object
typedef void(*signature)(TArgs...);
//! Constructors
inline Action(const signature& pFunc = nullptr) : mPointer(pFunc) {}
inline Action(const Action& pCopy) : mPointer(pCopy.mPointer) {}
//! Operator Call
inline bool operator() (TArgs ... pArgs) const { if (!mPointer) return false; mPointer(pArgs...); return true; }
//! Operators
inline Action& operator=(const Action& pCopy) { mPointer = pCopy.mPointer; return *this; }
inline Action& operator=(const signature& pFunc) { mPointer = pFunc; return *this; }
inline operator bool() const { return (mPointer != nullptr); }
private:
//! Store a pointer to the callback function
signature mPointer;
};
Ancak, bu sarıcı ayıklama bilgi veya biçimlendirilmiş metin çıktısı olan en olası kullanım durumu gibi hissediyorum. Bu, kullanıcı tanımlı işlevler veya printf gibi dahili işlevler aracılığıyla olabilir. printf imzası ile eşleştirmek için bir Eylem gibi yaratılmış olacaktır:
Action<int(const char*, ...)> callback = printf;
ve herhangi başka bir Eylem davranacaklarını aynı şekilde işletmek mümkün olacaktır. Bulduğum problem "...", şablon imzasını uzmanlıklardan biriyle hizalamamaya zorlayacak, bunun yerine sadece bir prototip olan ilk adımı atacak.
Bunun neden işe yaramadığını ve derleyicinin neden gerekli sınıfın üretimiyle başa çıkamayacağını tam olarak anlayabiliyorum, ancak buradaki birinin ya buna benzer bir şey elde etmenin herhangi bir gizli yolu olduğunu umuyordum. Sorunuzun söz altında yorumlandığı gibi
#include <utility>
#include <cstdio>
#include <cmath>
template<typename Fn>
class Action {
Fn* function_ptr;
public:
Action() noexcept : function_ptr(nullptr) {}
Action(std::nullptr_t) noexcept : function_ptr(nullptr) {}
Action(const Action& other) : function_ptr(other.function_ptr) {}
Action(Fn f) : function_ptr(f) {}
Action& operator=(const Action& other) {
return (function_ptr = other.function_ptr, *this);
}
Action& operator=(std::nullptr_t) {
return (function_ptr = nullptr, *this);
}
Action& operator=(Fn f) {
return (function_ptr = f, *this);
}
template<typename... Params>
auto operator()(Params&&... params) {
return function_ptr(std::forward<Params>(params)...);
}
};
: Herhangi bir yardım çok thanks :)
Neden std :: function' kullanılmıyor? – StoryTeller
"Eylem" in amacı nedir? Hangi gereksinimi ['std :: function'] kullanamazsınız (http://en.cppreference.com/w/cpp/utility/functional/function)? Hangi sorun '' eylem' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –
https://stackoverflow.com/questions/18370396/why-cant-stdfunction-bind-to-c-style-variadic-functions, neredeyse bunun nasıl gerçekleştirileceğine dair bir yorumda bulundu. Her bir değişken fonksiyon için bence size yardımcı olacak somut bir sınıfa ihtiyaç duyacaksınız ve umuyoruz ki, aradığınız fonksiyonun v * varyantı var. – mksteve