首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++根据auto的具体类型编译代码

C++根据auto的具体类型编译代码
EN

Stack Overflow用户
提问于 2019-09-30 23:35:36
回答 2查看 157关注 0票数 4

我有一段C++代码

代码语言:javascript
复制
auto returnvalue = m_func(x, y, z); 

其中m_func的类型取决于模板参数。然后,我处理returnvalue,它工作得很好,直到m_func是一个返回空的函数。但我需要一个机制来调用

代码语言:javascript
复制
m_func(x,y,z)

如果m_func的返回值为空,而上面的版本不为空。总的来说,在伪代码中,它需要看起来像这样

代码语言:javascript
复制
if ( returnvalue of m_func is void ) 
     call m_func directly
else 
     auto retval = m_func(...) 
     handle the return value

如何使用C++11/14来完成这些工作?

编辑:

m_func可以是:

代码语言:javascript
复制
void func(type1 arg1, type2 arg, ...) 

代码语言:javascript
复制
std::tuple<...> func(type1 arg1, type2 arg, ...) 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-01 00:13:41

虽然C++17有if constexpr来简单地处理它,但C++11/C++14必须使用一些重载来通过SFINAE或标记分派或专门化来处理它,下面是一个标记分派版本:

代码语言:javascript
复制
void internal_impl(std::true_type/*, ... */) {
    m_func(x, y, z);
}
void internal_impl(std::false_type/*, ... */) {
    auto value = m_func(x, y, z);

    foo(value);
}

void internal(/*... */) {
    internal_impl(std::integral_constant<bool,
                                         std::is_void<decltype(m_func(x, y, z))>::value>{}
                  /*, ...*/);
}
票数 4
EN

Stack Overflow用户

发布于 2019-09-30 23:55:12

在C++17之前,您可以使用模板专门化:

代码语言:javascript
复制
template<class R>
struct handle {
    template<class F>
    static void the_return_value(F m_func) {
        auto retval = m_func(x, y, z);
        // handle the return value
    }
};

template<>
struct handle<void> {
    template<class F>
    static void the_return_value(F m_func) {
        m_func(x, y, z);
    }
};

// usage
using R = decltype(m_func(x, y, z));
handle<R>::the_return_value(m_func);

在C++17中,您可以改用if constexpr

代码语言:javascript
复制
using R = decltype(m_func(x, y, z));
if constexpr (std::is_void_v<R>) {
    m_func(x, y, z);
} else {
    auto retval = m_func(x, y, z);
    // handle the return value
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58171101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档