This is the key part of the interface for implementing a new election method in my simulation framework.

/* Use these */
class Voter {
public:
	float getPref( int i );
};

class VoterArray {
public:
	Voter& operator[]( int i );
};

/* Implement a subclass of this */
class VotingSystem {
public:
	virtual void init( const char** envp );
	/* return winner in winnerArray[0], second place in [1], and so on */
	virtual void runElection( int* winnerArary, const VoterArray& they );
	virtual ~VotingSystem();
};

Details here:
Voter.h
VotingSystem.h

A good simple example is the "Pick One" or "plurality" election method.

For those not up on C++, implementing an election method in this form of C would make it easy for me to translate:

void run_election_c( int* winnerArray, float** ratings, int numVoters, int numChoices ) {
	/* for example, implementing pick-one/plurality */
	int* counts = (int*)malloc( sizeof(int*) * numChoices );
	int i, v;
	
	for ( i = 0; i < numChoices; i++ ) { counts[i] = 0; }
	for ( v = 0; v < numVoters; v++ ) {
		/* for each voter, find the highest rated choice and vote for it */
		int maxi = 0;
		float tmax = ratings[v][0];
		for ( i = 1; i < numChoices; i++ ) {
			if ( ratings[v][i] > tmax ) {
				tmax = ratings[v][i];
				maxi = i;
			}
		}
		counts[maxi]++;
	}
	{
		int maxi = 0;
		int max = counts[0];
		for ( i = 1; i < numChoices; i++ ) {
			if ( counts[i] > max ) {
				max = counts[i];
				maxi = i;
			}
		}
		/* winnerArary[0] receives the _index_ of the winner. */
		winnerArray[0] = maxi;
		/* can optionally sort the indecies of all the choices into the outbound argument "winnerArray", but really only the winner at position zero matters */
	}
	free( counts );
}