0
votes

Remplacer (ou ré-implémenter?) STD :: Fonction pour certaines statistiques et tests

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.


0 commentaires

3 Réponses :


0
votes

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.

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.


1 commentaires

Pour certaines constructions spéciales, je veux surveiller en permanence :) Donc, la réécriture semble être la seule solution raisonnable pour moi :(



1
votes

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);
}


6 commentaires

CARE AVEC Constructeur de modèles, CustomWrapper (CustomWrapper &) 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 &&) , mais aussi C (C &); C (const C &&) (et j'ignore volatile 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.



2
votes

Vous pouvez faire quelque chose comme: xxx

Démo < / a>


6 commentaires

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 ?


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 est 0 donc int (tandis que le pointeur est attendu pour certains paramètres). La spécialisation peut permettre à Mimic std :: fonction de fonction 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!