J'ai un cas particulier, où j'aimerais mesurer les statistiques sur ma STD :: Utilisation de la fonction. Habituellement, des choses comme le temps passé, la quantité d'appels, quelle fonction s'appelle souvent et parfois pour les tests comme une jeter de manière aléatoire NullPtr pour vérifier comment mon code le gère.
Je pensais à hériter de STD :: Func, puis remplacez le Fonction qui récupère le pointeur - ou quelque chose comme ça - mais après avoir lu plusieurs sujets et guides, je suis arrivé à la conclusion qu'elle est très non advise. p>
Ma deuxième pensée est de créer simplement une classe d'emballage. Refactoring mon article entier pour utiliser ce wrapper au lieu de STD :: La fonction ne serait pas difficile à faire, de sorte que ça va. Tout ce que je veux éviter, c'est d'utiliser une utilisation inutile et inconfortable, comme une fonction supplémentaire. EG. --
std::function<...> dummyvar (...); // Later I can call this dummy var as simply as dummyvar(...) // I don't want to add extra complexity, like this: CustomWrapper<...> customdummy (...); customdummy.getVal()(...); // Best would be if I could actually "simply" replace all std::function to the Custom Wrapper.
3 Réponses :
Voulez-vous qu'il soit constamment contrôlé des statistiques ou une seule fois avant que votre programme soit expédié? Si seulement une fois que je recommanderais d'utiliser des outils de profiler / de couverture pour voir combien de fois la fonction de fois est référencée. P>
Si vous avez besoin de statistiques constantes, vous devez consulter STD :: Fonction Interface ( https://fr.cppreference.com/w/cpp/uttility/fonctionnel/function ) et créer une nouvelle implémentation pour cela - ce n'est pas vraiment difficile à mettre en œuvre. P>
Pour certaines constructions spéciales, je veux surveiller en permanence :) Donc, la réécriture semble être la seule solution raisonnable pour moi :(
Je pense qu'ici est l'idée que vous pouvez utiliser pour créer un wrapper:
template <typename T> class CustomWrapper; template <typename Result, typename ...Args> class CustomWrapper<Result(Args...)> { public: template <typename ...SomeArgs> CustomWrapper(SomeArgs&&... args) : func(std::forward<SomeArgs>(args)...) { } CustomWrapper(const CustomWrapper&) = default; CustomWrapper(CustomWrapper&&) = default; auto operator()(Args&&... args) { return func(std::forward<Args>(args)...); } private: std::function<Result(Args...)> func; }; void foo() { CustomWrapper<void(int, int)> func([](int x1, int x2) {}); func(1, 2); }
CARE AVEC Constructeur de modèles, CustomWrapper (CustomWrapper &) Code> correspondrait à votre modèle entraînant un code non valide.
@ Jarod42, oui, votre copie droite et votre constructeur de déplacement doivent être mis en œuvre séparément
Je voulais dire que le constructeur de modèles doit être protégé, ou vous devez fournir toutes les variantes de Copy / MOVE Constructeur (régulier C (const C &); c (C &&) code>, mais aussi
C (C &); C (const C &&) Code> (et j'ignore
volatile code> cas).
Je viens d'essayer cela et j'ai échoué à compiler des importations dynamiques: goodbolt.org/z/vno4zv - probablement L'un des constructeurs manque, mais je suis encore faible pour trouver ce qu'est exactement :)
@ Unc3nzured, on dirait que le problème est avec __stdCall. STD :: Fonction dans une bibliothèque standard MSVS stocke en quelque sorte la convention appelante, alors que ma mise en œuvre - non
Wow, intervecteur. GCC n'accepte même pas mon type de fonction, Clang compile parfaitement et Visual Studio ne parvient pas à compiler probablement à cause des trucs STDCALL.
Vous pouvez faire quelque chose comme:
Je me suis battu de la compilation de votre source pendant assez longtemps, lorsque je me suis rendu compte que cela semble ne travailler que sur Clang. GCC et VC ont des problèmes avec le paramètre __STDCall dans la définition de la fonction. Connaissez-vous une solution de contournement pour le problème?
@ UNC3NZURED: Je corrige une faute de frappe et fournissez une démonstration de liaison. Alors travaillez sur GCC / CLANG.
Utilisez-vous explicitement __ stdcall code>?
Windows API Je suis de manière dynamique à utiliser stdcall, donc je ne peux donc pas les changer. Voici comment je veux l'utiliser: goodbolt.org/z/x9slwx ai-je essayé quelque chose de mal?
Fonctionne avec des paramètres corrects: Demo . Comme je pouvais utiliser des références, null code> est
0 code> donc
int code> (tandis que le pointeur est attendu pour certains paramètres). La spécialisation peut permettre à Mimic
std :: fonction de fonction code> comportement, mais avec des copies / mouvements supplémentaires
Ahhh, donc le problème n'était pas avec le stdcall. Je dois toujours m'habituer aux messages d'erreur du compilateur CPP lorsqu'il s'agit de modèles. Merci!