我有一个模板类,其中有一个方法,模板参数指示该方法的输入和输出,如下所示:
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) 我希望能够使用模板包声明一个类,这样类本身将有一个成员变量元组,它将每个模板包成员包装在某种容器类型中.基本目标如下:
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)
理想情况下,我希望能够将任何模板化对象作为包装类型.