gpt4 book ai didi

c++ - 可变参数模板参数问题

转载 作者:行者123 更新时间:2023-11-28 01:25:12 27 4
gpt4 key购买 nike

我正在尝试编写一个辅助模板方法,为我想做的每种分析获取类型名称。我希望 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);

我在这里做错了什么?

我也知道自制加密是个坏主意。这是一个个人项目,永远不会用于生产。

最佳答案

建议:试试

template <int = 0>
constexpr void doMultiAnalysis(std::vector<Result*>& vector, u8* plainText, u8* cipherText, u64 length, TroyContext* context, TroyCipher* cipher, u32 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()对于最后一种类型,你有歧义,因为 doMultianalysis()匹配。

template <int = 0>
constexpr void doMultiAnalysis(...)

你有那个电话 doMultiAnalysis()最后一个类型只匹配可变版本,当这个版本调用 doMultiAnalysis<rest...>() 时空 rest...列表,匹配(仅)int = 0版本。

关于c++ - 可变参数模板参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54187818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com