Вам знакомо понятие SFINAE ? Используя эту концепцию, вы можете включать или исключать шаблоны функций из набора кандидатов на основе любого свойства аргументов шаблона. Однако, как сказал Алекс Мартелли, это должно происходить в сигнатуре, а не в теле метода.
Это означает, что вы должны иметь возможность принимать решения во время компиляции относительно некоторого свойства типа T и использовать результат этого решения, чтобы заставить подпись шаблона стать недопустимой, что исключит этот шаблон из набора кандидатов компилятора без поднимая ошибку компиляции.
В Boost есть две библиотеки, которые могут это облегчить: Boost.TypeTraits , что позволяет задавать такие вопросы, как "Является ли T массивом?" или "Т указатель?" или "T является подклассом U?" во время компиляции. Результат этого запроса может быть использован Boost.EnableIf для исключения функции (или нет, по желанию).
Возможно, вы сможете достичь того, что вы есть, после использования комбинации этих библиотек. Если вы используете определенный компилятор, вы также можете достичь аналогичных результатов, используя специфичные для компилятора расширения (если это нормально для вас). Например, используя MSVC, вы можете использовать ключевое слово __ if_exists . В зависимости от того, насколько точно ваш простой пример отражает то, что вы действительно хотите сделать, один метод может быть чище другого.