I don't mess around a lot with templates (or with GTK), but today I wrote something and would like to know how it can be improved, and hopefully clarify a few things in the process.
So, Randolfi()
is a function template which returns a random number. A range can be specified as arguments.
It uses features new to C++11, based on these:
(The name "Randolfi" is a joke made by a few colleagues regarding my last name, Ranolfi.)
randolfi.hpp
#ifndef RANDOLFI_HPP
#define RANDOLFI_HPP
#include <random>
template <typename T>
T Randolfi()
{
std::mt19937 rng;
rng.seed( std::random_device()() );
std::uniform_int_distribution<T> dist;
return dist(rng);
}
template <typename T>
T Randolfi(T range_start, T range_end)
{
std::mt19937 rng;
rng.seed( std::random_device()() );
std::uniform_int_distribution<T> dist(range_start, range_end);
return dist(rng);
}
#endif //RANDOLFI_HPP
randolfi-test.cpp
#include <iostream>
#include <string>
#include <gtkmm.h>
#include "randolfi.hpp"
using namespace std;
int main()
{
auto app = Gtk::Application::create();
uint a_random_number = Randolfi<uint>();
Gtk::MessageDialog dialog( to_string(a_random_number) );
dialog.run();
return 0;
}
Notes:
Somehow it doesn't feel right to have such a large proportion of redundant lines across the function overloads. I think there might be a template-related trick to help here, but searching for it proved useless since all the results I found (like this one) are concerned about type parameter overloading, which is not my case.
I though about declaring it as
Randolfi(T range_start = NULL, T range_end = NULL)
and then checkingif (range_start != NULL && range_end != NULL)
, but that does not save me any lines, and also appears to be frowned upon.As it is, the function can be called without type argument for the second overload, but not for the first one:
Randolfi(0, 100); // type parameter ommited for template Randolfi(); // Fails - compiler has no clue on know how to instantiate template
I have a feeling this inconsistency is bad practice.
I'm mostly concerned about the template header, but I did include my testing code (randolfi-test.cpp) to this question so maybe someone can let me know if I did something terribly wrong. From my part, I'd like to avoid calling
Gtk::Application::create()
but that doesn't seem to be possible.
Thanks!