Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的模板函数返回类型推导+;03_C++_Templates_Template Argument Deduction_Return Type Deduction - Fatal编程技术网

C++ C+中的模板函数返回类型推导+;03

C++ C+中的模板函数返回类型推导+;03,c++,templates,template-argument-deduction,return-type-deduction,C++,Templates,Template Argument Deduction,Return Type Deduction,我想在C++03中实现以下功能: template <typename T1, typename T2> T1 convert(bool condition, T2& value) { return condition ? value : conversionFunction(value); } 模板 T1转换(布尔条件、T2和值) { 返回条件?值:转换函数(值); } 除非我想调用convert,而不必显式指定T1。我该怎么做 编译器不推断返回类型(这与返回类

我想在C++03中实现以下功能:

template <typename T1, typename T2>
T1 convert(bool condition, T2& value)
{
    return condition ? value : conversionFunction(value);
}
模板
T1转换(布尔条件、T2和值)
{
返回条件?值:转换函数(值);
}

除非我想调用
convert
,而不必显式指定
T1
。我该怎么做

编译器不推断返回类型(这与返回类型不支持重载一致)。必须明确指定此模板参数,例如,通过调用

convert<Obj>(x);
替换
/*条件*/
,可能会有所帮助

用于转换器的语法称为分部。
有关指定
convert

的返回值时为什么需要
typename
的信息,请参见。也许您可以使用hack。问题是延迟转换,直到您实际使用返回值。返回值是一个帮助对象,它允许自己转换为其他对象

template <typename T>
struct ConvertHack {
    T &value_;
    const bool cond_;
    ConvertHack (bool cond, T &value) : value_(value), cond_(cond) {}
    template <typename U> operator U () const {
        return cond_ ? value_ : conversionFunction(value_);
    }
};

template <typename T>
ConvertHack<T> convert(bool condition, T& value) {
    return ConvertHack<T>(condition, value);
}
模板
结构转换黑客{
T&value;
康斯特布尔康德;
ConvertHack(boolcond,T&value):value(value),cond(cond){
模板运算符U()常量{
返回条件值:转换函数(值);
}
};
模板
ConvertHack转换(布尔条件、T和值){
返回ConvertHack(条件、值);
}

如果条件成立,则返回值,该值必须可转换为T1,对吗?不,不需要转换。转换模板的第二个参数既没有默认值,也没有指定值?我们希望调用转换(x)能被上面的模板拾取?。。。对我不确定你的意思。@armundle真的修复了。为什么要在
Obj
上使用模板?对不起,我误读了你以前的答案。只需替换所需的返回类型(无论您想要什么
T1
)。
template <typename T>
struct ConvertHack {
    T &value_;
    const bool cond_;
    ConvertHack (bool cond, T &value) : value_(value), cond_(cond) {}
    template <typename U> operator U () const {
        return cond_ ? value_ : conversionFunction(value_);
    }
};

template <typename T>
ConvertHack<T> convert(bool condition, T& value) {
    return ConvertHack<T>(condition, value);
}