diff --git a/include/gnss_utils/utils/utils.h b/include/gnss_utils/utils/utils.h
index 06eba1b1861a2b9a82ee7272fc7743f7810a234c..a107051641c6063ebfd6383e0682a741d8d6b605 100644
--- a/include/gnss_utils/utils/utils.h
+++ b/include/gnss_utils/utils/utils.h
@@ -17,10 +17,20 @@
 namespace GnssUtils
 {
 void print(std::string& _msg);
-void printArray(std::string _name, int* _array, int size);
-void printArray(std::string _name, unsigned char* _array, int size);
-void printArray(std::string _name, double* _array, int size);
-void printArray(std::string _name, float* _array, int size);
+
+template <typename T, size_t size>
+void printArray(std::string name, T (&array)[size])
+{
+  std::cout << name << ": [";
+  for (int ii = 0; ii < size; ++ii)
+  {
+    std::cout << array[ii];
+    if (ii == size - 1)
+      std::cout << "] \n";
+    else
+      std::cout << ",";
+  }
+}
 
 template <typename T>
 inline bool addToArray(const T& new_element, T*& array, int& n, int& nmax)
diff --git a/src/observations.cpp b/src/observations.cpp
index 8e5864c644b561b3d328262f25a89fe2999f068d..0ca80fd9e9612ec569a9e295375a40cbb3e76748 100644
--- a/src/observations.cpp
+++ b/src/observations.cpp
@@ -163,15 +163,15 @@ static void Observations::print(obsd_t& _obs)
   GnssUtils::print(msg);
   std::cout << "Time [s]: " << _obs.time.time << " + " << _obs.time.sec << "\n";
   std::cout << "Time valid: " << _obs.timevalid << std::endl;
-  printArray("SNR: ", _obs.SNR, ARRAY_SIZE(_obs.SNR));
-  printArray("LLI: ", _obs.LLI, ARRAY_SIZE(_obs.LLI));
-  printArray("code: ", _obs.code, ARRAY_SIZE(_obs.code));
-  printArray("code: ", _obs.qualL, ARRAY_SIZE(_obs.qualL));
-  printArray("code: ", _obs.qualP, ARRAY_SIZE(_obs.qualP));
+  printArray<unsigned char, ARRAY_SIZE(_obs.SNR)>("SNR: ", _obs.SNR);
+  printArray<unsigned char, ARRAY_SIZE(_obs.LLI)>("LLI: ", _obs.LLI);
+  printArray<unsigned char, ARRAY_SIZE(_obs.code)>("code: ", _obs.code);
+  printArray<unsigned char, ARRAY_SIZE(_obs.qualL)>("code: ", _obs.qualL);
+  printArray<unsigned char, ARRAY_SIZE(_obs.qualP)>("code: ", _obs.qualP);
   printf("Freq. channel: %uc \n", _obs.freq);
-  printArray("L: ", _obs.L, ARRAY_SIZE(_obs.L));
-  printArray("P: ", _obs.P, ARRAY_SIZE(_obs.P));
-  printArray("D: ", _obs.D, ARRAY_SIZE(_obs.D));
+  printArray<double, ARRAY_SIZE(_obs.L)>("L: ", _obs.L);
+  printArray<double, ARRAY_SIZE(_obs.P)>("P: ", _obs.P);
+  printArray<float, ARRAY_SIZE(_obs.D)>("D: ", _obs.D);
 }
 
 void Observations::printBySat(const int& _sat_number)
diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp
index 49a7f38dcc83cf51ce95897a1d0ba89a29918d27..ce565b86ceed99855aefb54358ec006b38a41c90 100644
--- a/src/utils/utils.cpp
+++ b/src/utils/utils.cpp
@@ -9,58 +9,6 @@ void print(std::string& _msg)
   std::cout << msg << "\n";
 }
 
-void printArray(std::string _name, int* _array, int size)
-{
-  std::cout << _name << ": [";
-  for (int ii = 0; ii < size; ++ii)
-  {
-    std::cout << _array[ii];
-    if (ii == size - 1)
-      std::cout << "] \n";
-    else
-      std::cout << ",";
-  }
-}
-
-void printArray(std::string _name, unsigned char* _array, int size)
-{
-  std::cout << _name << ": [";
-  for (int ii = 0; ii < size; ++ii)
-  {
-    std::cout << (int)(_array[ii]);
-    if (ii == size - 1)
-      std::cout << "] \n";
-    else
-      std::cout << ",";
-  }
-}
-
-void printArray(std::string _name, double* _array, int size)
-{
-  std::cout << _name << ": [";
-  for (int ii = 0; ii < size; ++ii)
-  {
-    std::cout << _array[ii];
-    if (ii == size - 1)
-      std::cout << "] \n";
-    else
-      std::cout << ",";
-  }
-}
-
-void printArray(std::string _name, float* _array, int size)
-{
-  std::cout << _name << ": [";
-  for (int ii = 0; ii < size; ++ii)
-  {
-    std::cout << _array[ii];
-    if (ii == size - 1)
-      std::cout << "] \n";
-    else
-      std::cout << ",";
-  }
-}
-
 }  // namespace GnssUtils
 
 bool operator==(const gtime_t& time1, const gtime_t& time2)