gpt4 book ai didi

c++ - 使用模板重载运算符,但防止重新定义

转载 作者:太空狗 更新时间:2023-10-29 20:02:10 27 4
gpt4 key购买 nike

我想定义 operator<< 的特化使用模板,但我不希望它破坏此运算符的行为,如果它已经为某种数据类型定义的话。

enum State {Open, Locked};
enum Input {Coin, Push};

std::string ToString(State c){
switch (c) {
case Locked : return "Locked";
case Open : return "Open";
}
}

std::string ToString(Input c){
switch (c) {
case Coin : return "Coin";
case Push : return "Push";
}
}

template<typename T> //obviously, a bad idea
std::ostream& operator<<(std::ostream& s, T c) {
return s<<ToString(c);
}

稍后我想在代码中使用:

int main() {
std::cout<<Coin<<std::endl;
std::cout<<Open<<std::endl;
std::cout<<std::string("normal string")<<std::endl;
}

毫不奇怪,上面给出了编译错误:

error: ambiguous overload for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::string {aka std::basic_string<char>}’)
std::cout<<std::string("normal string")<<std::endl;

(还有更多)

问:如果函数/运算符已经有定义,如何告诉编译器忽略模板?

最佳答案

您可以雇用 SFINAE使模板实例化仅对 ToString() 的重载支持的类型有效,例如

template<typename T, typename = decltype(ToString(std::declval<T>()))>
std::ostream& operator<<(std::ostream& s, T c) {
return s<<ToString(c);
}

LIVE

关于c++ - 使用模板重载运算符,但防止重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45352080/

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