Я пытаюсь написать вспомогательный шаблонный метод, который принимает имена типов для каждого вида анализа, который я хочу сделать. Я хочу, чтобы API выглядел примерно так:
doMultiAnalysis<FrequencyResult, DiffusionResult, GeneralCipherResult>(vector, plainText, cipherText, length, a1Context, (TroyCipher*) &a1, 1000);
Я создал этот рекурсивный шаблон, который работает с текущим аргументом шаблона, а затем передает остальное обратно в функцию:
template<typename T, typename... rest>
void doMultiAnalysis(std::vector<Result*>& vector, u8* plainText, u8* cipherText, u64 length, TroyContext* context, TroyCipher* cipher, u32 iterations) {
T* result = new T{};
result->doAnalysis(plainText, cipherText, length, context, cipher, iterations);
vector.push_back((Result*) result);
std::cout << *result << std::endl;
doMultiAnalysis<rest...>(vector, plainText, cipherText, length, context, cipher, iterations);
}
Если я пытаюсь скомпилировать этот код с MSVC, я, конечно, получаю «Не найдено подходящих перегруженных функций», потому что базовый вариант не существует. Так что, если я сделаю это:
template<typename T, typename... rest>
void doMultiAnalysis(std::vector<Result*>& vector, u8* plainText, u8* cipherText, u64 length, TroyContext* context, TroyCipher* cipher, u32 iterations) {
T* result = new T{};
result->doAnalysis(plainText, cipherText, length, context, cipher, iterations);
vector.push_back((Result*) result);
std::cout << *result << std::endl;
doMultiAnalysis<rest...>(vector, plainText, cipherText, length, context, cipher, iterations);
}
template<typename none = void>
constexpr void doMultiAnalysis(std::vector<Result*>& vector, u8* plainText, u8* cipherText, u64 length, TroyContext* context, TroyCipher* cipher, u32 iterations) {
}
Компилятор выдает «неоднозначный вызов перегруженной функции» в строке:
doMultiAnalysis<rest...>(vector, plainText, cipherText, length, context, cipher, iterations);
Что я здесь не так делаю?
Также я знаю, что самодельная криптография - плохая идея. Это личный проект для развлечения, который никогда не будет использован в производстве.