小编MrB*_*app的帖子

处理条件编译的多个条件的最佳方法

我有一个模板类,其中有一个方法,模板参数指示该方法的输入和输出,如下所示:

template <typename In, typename Out>
class Foo
{
    Out fn(const In& in)
    {
        Out out;
        return out;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试了这个,但是当试图void用于任何一个In或那个时,会出现(可能很明显)错误Out.所以我尝试添加多个方法,这些方法是这个主题的变体,希望它们的替换能够启用相关功能并禁用无效功能:

template <std::enable_if_t<std::is_void<InputType>::value>* = nullptr>
OutputType fn()
{
    OutputType out;
    return out;
}

template <std::enable_if<(!std::is_void<OutputType>::value) && (!std::is_void<InputType>::value)>* = nullptr>
OutputType fn(InputType& t)
{
    OutputType out;
    return out;
}

template <std::enable_if<std::is_void<OutputType>::value>* = nullptr>
void fn(InputType& t)
{}
Run Code Online (Sandbox Code Playgroud)

这让我回到了"无效参考无效"领域,或者是碰撞签名.

我应该如何优雅地处理这些条件,以便从模板中只创建以下签名之一:

/*In == void && Out != void*/
Out fn(/* no input here to keep compiler happy*/) …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae c++14

4
推荐指数
1
解决办法
1072
查看次数

将元组成员包装在其他模板类型中

我希望能够使用模板包声明一个类,这样类本身将有一个成员变量元组,它将每个模板包成员包装在某种容器类型中.基本目标如下:

template <typename Types...>
class VectorOfMembers 
{
public:
    // Member tuple where each element is expanded in a container
    std::tuple<std::vector<Type[1]>, std::vector<Type[2]>, std::vector<TypeN...>>
};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望能够将任何模板化对象作为包装类型.

c++ templates variadic

0
推荐指数
1
解决办法
142
查看次数

标签 统计

c++ ×2

templates ×2

c++14 ×1

sfinae ×1

variadic ×1