当前位置: 首页 > 知识库问答 >
问题:

使第一个模板参数可选

查锦程
2023-03-14

我有一个函数,它使用Boost进行base64编码。它有两个模板参数:一个用于输入的容器类型,另一个用于输出的容器类型。这允许您使用std::vector提供二进制数据,但可以返回std::string

这是代码:

template<typename OutputContainer, typename InputContainer>
OutputContainer Encode(InputContainer const& data)
{
    using namespace boost::archive::iterators;
    using base64_it = base64_from_binary<transform_width<
        typename InputContainer::const_iterator, 6, 8>>;

    OutputContainer result(base64_it(data.begin()), base64_it(data.end()));

    static std::string const padding[] { "", "==", "="};
    auto const& pad = padding[data.size() % 3];
    result.insert(result.end(), pad.begin(), pad.end());

    return result;
}

用法示例:

std::string data = "Hello World!+";
auto encoded = Encode<std::string>(data);

这里有活样品

请注意,在上面的示例中,我仍然必须为输出容器提供模板参数,即使它与输入容器的类型相同。在这些场景中,我希望OutputContainer模板参数是可选的,而是使用由InputContainer推导的类型。我不确定我可以执行什么变通或调整来获得这种界面,但很高兴看到SO社区能想出什么。

注意,我也愿意采用以迭代器为中心的方法,但由于冗余/样板文件,我避免了这种方法(我认为在容器中传递比迭代器更简单)。如果它最终看起来像是std::transform()的4参数版本,我想我对这个解决方案会不太满意。

共有1个答案

皇甫夕
2023-03-14

使用重载(不是专门化)的情况下,输入容器输出容器是相同的,enable_if禁用原始的实现在这种情况下,它可以实现您所要求的。一个警告是,如果两个容器类型相同,则不再可能显式指定它们,除非还提供第三个参数:

template<typename OutputContainer, typename InputContainer, typename = std::enable_if_t<!std::is_same_v<OuptputContainer, InputContainer>>>
OutputContainer Encode(InputContainer const& data)
{
    // Your implementation
}

template<typename OutputContainer>
OutputContainer Encode(OutputContainer const& data)
{
    return Encode<OutputContainer, OutputContainer, void>(data);
}

戈德博尔特的例子。

 类似资料:
  • 我有以下问题:一个类模板a,有几个模板参数,我想构建一个类B,它以a为模板参数,并提取a的第一个模板参数,以便在某种方法中使用它(想想从std::vector 中提取int并返回默认的int{})。 我知道这种天真的方法不会编译,但我不知道如何实现这样的东西。感谢任何提示。

  • (...)“m”不约束类型(...)

  • 在这种情况下,我总是希望从第一个参数中推导出来,但看起来我没有很好地表达这一点。的类型是,因此: 有没有一种方法可以声明,这样第二个参数就不参与模板参数的推导了?

  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 我有一个模板类,其中每个模板参数代表内部计算可以处理的一种类型的值。需要模板(而不是函数重载),因为值被作为::any传递,并且它们的类型在运行时之前不清楚。 为了正确地转换为正确的类型,我希望每个变量参数类型都有一个成员列表,类似于这样: 或者,我想将模板参数类型存储在一个列表中,以便对其进行RTTI处理(?)。但如何将它们保存在std::initializer\u列表成员中,我也不清楚。 谢谢

  • 假设我有这样的东西: 每种类型在编译时都是已知的。因此,对于添加到映射中的每个类型配置,都会创建一个新的映射。 是否有一种方法可以在所有匹配T参数的映射实例中仅搜索关键字(和关键字类型)? 编辑:对不起,我的问题太简单了。我害怕把它做得太大,最后它错过了我的意图。但我想,正如@Quimby所解释的那样,我试图实现的目标是不可能实现的。 我真正想做的是一个debug助手(实际上是虚幻的),来跟踪对象