6
votes

Copier la signature de la fonction

Je souhaite créer de nombreuses fonctions avec les mêmes paramètres, par exemple:

#define INT_OPERATION(name) const int name (const int a, const int b)
INT_OPERATION(add) { return (a + b); }
INT_OPERATION(subtract) {return (a - b); }

c++

5 commentaires

Pourquoi ne pas utiliser de modèles?


Je ne sais pas quelle est la motivation derrière ce besoin. Pouvenir std :: plus et std :: moins , std :: moins , etc. Servir vos besoins?


On dirait que ce sont juste pour des raisons explicatives de le garder simple.


Un peu connexe: Stackoverflow.com/questions/4022984/... < / a>


@Rsahu Oui, comme l'a dit Kfsone, ce sont simplement pour la démonstration du problème.


4 Réponses :


1
votes

Si votre principale préoccupation est de pouvoir "modifier facilement les types des paramètres", il est simple de les écrire en tant que modèles afin que vous ne devez jamais modifier les types des paramètres:

template <typename T1, typename T2>
auto add (const T1 &a, const T2 &b) -> decltype(a + b) {
    return (a + b);
}


6 commentaires

Je ne pense pas que OP voulait changer de paramètre en premier lieu, mais les opérations.


Il essaie d'éviter la cuillère. Regardez l'exemple macro qu'il a donné.


Oui, le modèle requis est pour une binop et "Ajouter" est l'un des arguments.


@Jrok Il a dit: «Je suis capable de modifier facilement les types des paramètres une fois pour modifier toutes les fonctions». C'est une façon de ne jamais modifier les types des paramètres.


Toujours ignore complètement la question principale qui est "Je souhaite créer de nombreuses fonctions avec les mêmes paramètres, par exemple:", un peu comme une personne qui demande "Je suis affamé, avez-vous de la nourriture" et réponds "non, mais prenez cette assiette manger ce que vous avez fini par ".


@kfsone La façon dont je lis est "Je souhaite créer de nombreuses fonctions avec les mêmes paramètres, mais pour pouvoir modifier facilement les types des paramètres de toutes les fonctions que je veux conserver la plaque chauffante au même endroit". Ainsi, la résolution de la "nécessité de modifier les types de paramètres", le problème évite la nécessité d'éviter la chaudière.



1
votes

Si celles-ci étaient des fonctions membres, vous pouvez déclarer leur type commun ( Typedef const int fn (int, int) code>), déclarez les fonctions de membre à l'intérieur de la classe à l'aide de ce type:

Fn add, subtract;


0 commentaires

3
votes

Une fonction Signature forte> ne peut pas être Typedef code> ed. Seule le type d'une fonction. Il est donc valable de dire: xxx pré>

puis renvoyer une fonction ayant ce type: p> xxx pré>

strong> strong> Quand il s'agit de définissant forte> la fonction que vous devriez spécifier des arguments, la Follwing est donc invalide forte> p> xxx pré>

( Dès que vous placez un ensemble de () code> après Ajouter code> Vous déclarerez une fonction renvoyant une fonction simple qui n'est pas valide C ++) P>

Sur les types génériques h2>

La même procédure présente des limitations similaires lors de l'utilisation des outils de programmation générique. Vous peut STRT> déclarer le suivant TypeDEF: P>

const int add(int const a, int const b) {
    return a + b;
}


0 commentaires

2
votes

Peut-être quelque chose comme ça:

#include <iostream>
#include <functional>

typedef std::function<int(int, int)> IntFunction;

IntFunction add = [](int a, int b) {return a + b;};
IntFunction substract = [](int a, int b) {return a - b;};

int main(int, char**) {
    std::cout << add(1, 2) << std::endl;
    std::cout << substract(1, 2) << std::endl;
    return 0;
}


0 commentaires