C++ C++;模板和模糊函数调用
有些我无法控制的代码有许多重载函数,它们接受不同的类型 i、 e 我有一个模板函数,理想情况下,它可以接受这些类型中的任何一种,并将其传递给正确的setValue函数C++ C++;模板和模糊函数调用,c++,templates,ambiguous-call,C++,Templates,Ambiguous Call,有些我无法控制的代码有许多重载函数,它们接受不同的类型 i、 e 我有一个模板函数,理想情况下,它可以接受这些类型中的任何一种,并将其传递给正确的setValue函数 template <class T> do_something(T value) { ... setValue(value); 我能做些什么来解决这个问题,而不必像setValue的编写者那样复制和粘贴每种类型的代码?我没有以下问题: void setValue(int a) { } void se
template <class T>
do_something(T value) {
...
setValue(value);
我能做些什么来解决这个问题,而不必像setValue的编写者那样复制和粘贴每种类型的代码?我没有以下问题:
void setValue(int a)
{
}
void setValue(std::string a)
{
}
void setValue(bool a)
{
}
template <class T>
void func(T value)
{
setValue(value);
}
int main()
{
func(5);
}
void设置值(int a)
{
}
void setValue(标准::字符串a)
{
}
无效设置值(布尔值a)
{
}
模板
无效函数(T值)
{
设置值(值);
}
int main()
{
func(5);
}
以下是我的跑步记录:通过定义自己的设置值,并精确匹配并转发到正确的重载
void setValue(int i) { setValue(static_cast<double>(i)) }
void setValue(inti){setValue(static_cast(i))}
或者(如果您有许多相同类型的“setValue”函数),您可以帮助编译器选择要使用的重载,如下所示:
void setValue(char a);
void setValue(double a);
template <typename T>
struct TypeToUseFor
{
typedef T type;
};
template <>
struct TypeToUseFor<int>
{
typedef double type;
};
template <class T>
void func(T value)
{
setValue(static_cast<typename TypeToUseFor<T>::type>(value));
// setValue(value);
}
int main() {
func(0); // int -> ?
func('0'); // exact match
func(0.0); // exect match
func(0.f); // float -> double
return 0;
}
void设置值(字符a);
无效设置值(双a);
模板
结构类型为
{
T型;
};
模板
结构类型为
{
typedef双字型;
};
模板
无效函数(T值)
{
设置值(静态_转换(值));
//设置值(值);
}
int main(){
func(0);//int->?
func('0');//精确匹配
func(0.0);//执行匹配
func(0.f);//浮点->双精度
返回0;
}
您试图实例化模板的类型是什么?很可能是重载函数中没有完全匹配的类型,但您尝试了多个有效的conversionId::setValue((t)value)代码>?例如,char
可能会变得模棱两可:)@jcoder您完全正确,非常感谢。@K06一个糟糕的建议。您至少可以建议静态_cast(值)是的,此逻辑没有问题。我的问题似乎有点不同。
void setValue(int i) { setValue(static_cast<double>(i)) }
void setValue(char a);
void setValue(double a);
template <typename T>
struct TypeToUseFor
{
typedef T type;
};
template <>
struct TypeToUseFor<int>
{
typedef double type;
};
template <class T>
void func(T value)
{
setValue(static_cast<typename TypeToUseFor<T>::type>(value));
// setValue(value);
}
int main() {
func(0); // int -> ?
func('0'); // exact match
func(0.0); // exect match
func(0.f); // float -> double
return 0;
}