La send() invia byte a prescindere da quello che gli passi, quindi una conversione implicita già c'è. Aggiungiamoci poi che una stringa ASCIIZ del C è un caso particolare di array di char, si ottiene che devi passare anche una dimensione in quel prototipo.
Partendo dal presupposto che la tua funzione userà solo tipi semplici (int, char, float, etc.), una prima approssimazione può essere:
codice:
template <class T>
int invia(int sockfd, T *send_buf, int len) {
           if (send(sockfd, reinterpret_cast<char*>(send_buf), len * sizeof(T), 0) == -1) {perror("send");}
}
Ma a questo punto tanto vale usare direttamente send(), risparmiando una chiamata a funzione.