gpt4 book ai didi

c++ - 强制强类型枚举参与模板重载决策

转载 作者:行者123 更新时间:2023-12-03 06:53:54 24 4
gpt4 key购买 nike

根据这个问题 - template argument deduction with strongly-typed enumerations - 让强类型枚举器参与重载解析似乎具有挑战性 - 如果不是不可能的话。

如果我们有以下条件

#include <string>
#include <iostream>

void ExternalFunction(const std::string& tag, int value)
{
std::cout << tag << " - (int) " << value << std::endl;
}

void ExternalFunction(const std::string& tag, double value)
{
std::cout << tag << " - (double) " << value << std::endl;
}

void ExternalFunction(const std::string& tag, const std::string& value)
{
std::cout << tag << " - (string) " << value << std::endl;
}

class Wrapper
{
public:
virtual void DoSomething() = 0;
};

template <typename variable_type>
class VariableWrapper : public Wrapper
{
public:
VariableWrapper(variable_type variable) : variable(variable) {}

void DoSomething() override
{
ExternalFunction("tag", variable);
}

variable_type& variable;
};

template <typename enumerator, typename convert_to_string>
class EnumWrapper : public VariableWrapper<enumerator>
{
public:

EnumWrapper(enumerator& variable, convert_to_string encoder) : VariableWrapper<enumerator>(variable), encoder(encoder) {}

void DoSomething() override
{
ExternalFunction("tag", encoder(VariableWrapper<enumerator>::variable));
}

convert_to_string encoder;
};

enum class StronglyTyped
{
A,
B,
C
};

int main()
{
StronglyTyped e = StronglyTyped::A;
Wrapper* wrapper = new EnumWrapper(e, [](StronglyTyped S)->std::string{return "Test";});
wrapper->DoSomething();
}

如果我们尝试运行这个 - http://coliru.stacked-crooked.com/a/d555c4e3300ab05d - 我们得到了错误

main.cpp: In instantiation of 'void VariableWrapper<variable_type>::DoSomething() [with variable_type = StronglyTyped]':
main.cpp:31:14: required from here
main.cpp:33:29: error: no matching function for call to 'ExternalFunction(const char [4], StronglyTyped&)'
33 | ExternalFunction("tag", variable);
| ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
main.cpp:4:6: note: candidate: 'void ExternalFunction(const string&, int)'
4 | void ExternalFunction(const std::string& tag, int value)
| ^~~~~~~~~~~~~~~~
main.cpp:4:51: note: no known conversion for argument 2 from 'StronglyTyped' to 'int'
4 | void ExternalFunction(const std::string& tag, int value)
| ~~~~^~~~~
main.cpp:9:6: note: candidate: 'void ExternalFunction(const string&, double)'
9 | void ExternalFunction(const std::string& tag, double value)
| ^~~~~~~~~~~~~~~~
main.cpp:9:54: note: no known conversion for argument 2 from 'StronglyTyped' to 'double'
9 | void ExternalFunction(const std::string& tag, double value)
| ~~~~~~~^~~~~
main.cpp:14:6: note: candidate: 'void ExternalFunction(const string&, const string&)'
14 | void ExternalFunction(const std::string& tag, const std::string& value)
| ^~~~~~~~~~~~~~~~
main.cpp:14:66: note: no known conversion for argument 2 from 'StronglyTyped' to 'const string&' {aka 'const std::__cxx11::basic_string<char>&'}
14 | void ExternalFunction(const std::string& tag, const std::string& value)
| ~~~~~~~~~~~~~~~~~~~^~~~~

是否可以让强类型枚举器参与重载决策?我不想删除强类型 - 这确实解决了这个问题 - 因为我将不得不在多个枚举之间使用唯一的名称

编辑:我已经从问题中删除了 std::to_string 并相应地更新了代码,因为它被错误地关注了。

最佳答案

你的代码写错了。

好的,所以 EnumWrapper<>::DoSomething覆盖 VariableWrapper<T>::DoSomething .所以直接调用DoSomething就不会调用了在任何 EnumWrapper对象。

但这并不意味着 VariableWrapper<T>::DoSomething 不存在。它确实存在,您仍然可以通过合格的调用来调用它。因此,当您实例化 VariableWrapper<T>对于某些特定的 T ,该模板类的成员函数必须有效。

VariableWrapper<T>::DoSomething对任何 T 均无效不能用于调用 ExternalFunction直接地。这与具体的枚举无关;这纯粹是关于您如何编写函数。

你应该改成 EnumWrapper不继承 VariableWrapper .它们都可以继承自 BaseWrapper ,但他们没有相互继承的业务。或者你可以制作 ExternalFunction它本身是一个模板,可以解决如何为任何给定类型做任何事情。

关于c++ - 强制强类型枚举参与模板重载决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64327008/

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