Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++_Templates_Template Classes - Fatal编程技术网

C++ 模板方法中不同类型的不同代码路径

C++ 模板方法中不同类型的不同代码路径,c++,templates,template-classes,C++,Templates,Template Classes,假设我有这样一个模板类: template<typename TRequest, typename TResponse = void> class handler { private: TResponse process_core(const TRequest& request); public: TResponse process(const TRequest& request) { //log the request

假设我有这样一个模板类:

template<typename TRequest, typename TResponse = void>
class handler
{
private:
    TResponse process_core(const TRequest& request);
public:
    TResponse process(const TRequest& request)
    {
        //log the request        
        TResponse response = process_core(request);  //return process_core(request) works;
        //log the response, for void it's fine to log nothing
        return response;
    }
};

显然,
返回响应
会因
无效
类型而中断。正确的方法是什么?还是我的设计不是C++的方式?对于C++,我是新手。

不幸的是,代码> Value<代码>不是一个普通的类型,即使有一个旨在修复()的建议,所以你需要用一种特殊的方式来处理它。使用C++17,您只需使用

if constexpr(…)
在编译时进行分支:

TResponse process(const TRequest& request)
{
    TResponse response = process_core(request);
    // ...

    if constexpr(!std::is_same_v<TResponse, void>)
    {
        return response;
    }
}

请注意,在这种情况下,
process\u core
必须返回
nothing
而不是
void
,因此您需要某种专门化或编译时分支。

这是打字错误吗?我认为应该是
std::false\u type/*notvoid*/
?在修复
std::false\u type
打字错误后,标签调度工作非常完美。我不想更改使用伪返回类型的
process\u core
实现,对我来说,标记分派是C++14中最好的选择。谢谢
TResponse process(const TRequest& request)
{
    TResponse response = process_core(request);
    // ...

    if constexpr(!std::is_same_v<TResponse, void>)
    {
        return response;
    }
}
TResponse process(const TRequest& request)
{
    return processImpl(request, std::is_same<TResponse, void>{});
}

void process(const TRequest& request, std::true_type /* void */)
{
    TResponse response = process_core(request);
    // ...
}

TResponse process(const TRequest& request, std::false_type /* not void */)
{
    TResponse response = process_core(request);
    // ...
    return response;
}
struct nothing { };

template <typename T> 
struct void_to_nothing { using type = T; };

template <> 
struct void_to_nothing<void> { using type = nothing; };

template <typename T>
using void_to_nothing_t = typename void_to_nothing<T>::type;

auto process(const TRequest& request)
{
    void_to_nothing_t<TResponse> response = process_core(request);
    // ...
    return response;
}