Я экспериментирую с использованием шаблонных функций C ++ для уменьшения дублирования кода в небольшом сегменте модульного тестирования в моем коде, но безуспешно
Ну ... мне кажетсячто вы не понимаете, что такое шаблон-шаблон.
Если я правильно понимаю, вы думаете, что когда вы пишете
template <template <typename> typename F>
void CheckAgainstNumericTypes() {
F<char>();
}
, вы вызываете функцию F<char>()
.
Неверно.
То, что F<char>()
- это создание временного объекта типа F<char>
, инициализированного по умолчанию.
Вместо F<char>()
вы можете написать F<char>{}
, поэтому более ясно, что это не вызов функции шаблона.
На данный момент, я не знаюЕсли есть смысл ответить на ваш следующий ответ, но ...
Как я могу преобразовать свою функцию-член в тип, чтобы она была принята шаблоном?
Выне может.Не как тип.
Вы можете передать функцию - или статический член класса / структуры в аргументе шаблона не-типа (см. Первый ответ, который вы связали).
Но неСтатический метод (нестатическая функция-член) - это еще один тип зверя, и для его вызова требуется объект класса.
Лучшее, что я могу себе представить, это что-то следующее (осторожно: код не тестирует)
template <typename T, void (T::*M)()>
void foo (T & d)
{ d.*M(); }
и вы можете вызывать его
foo<SomeClassTest, &SomeClassTest::SomeClassIdentity>(someClassTestObject);
Как видите, вы можете передать класс и указатель на метод в качестве параметров шаблона (тип шаблона параметров первый, значениевторой) но вам нужен объект типа SomeClassTest
в качестве аргумента (someClassTestObject
).
Если вы хотите работать только с членами определенного класса (в вашем случае SomeClassTest
), выможно избежать аргумента шаблона типа и упростить его следующим образом:
template <void (SomeClassTest::*M)()>
void foo (SomeClassTest & d)
{ d.*M(); }
// ...
foo<&SomeClassTest::SomeClassIdentity>(someClassTestObject);
Есть ли другой способ достижения того же желаемого синтаксического результата в SomeClassTest :: Tests () без использования шаблонов шаблона?
Вы не можетеиспользуя параметры шаблона-шаблона.