微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 2 个函数模板化合并为一个

如何解决将 2 个函数模板化合并为一个

我正在尝试通过数组中的 boost::hana::string 名称查找插入到元组中的顺序获取 std::string_view(请检查代码,那里比我的话更容易理解)。>

我明白了,但是语法真的变得乱七八糟,失去了不言自明的含义,因为需要调用两个函数(1 fn 获取索引,1 个 templ. fn por 获取字符串)而不是只有一个直接电话。

请注意,这个问题比看起来更难,因为即使您更改字符串中的单个字符,boost::hana::string 也会返回不同的类型,而不管它们的长度。

代码也可在coliru中获得:TwiML element

#include <array>
#include <tuple>
#include <iostream>
#include <string_view>
#include <boost/hana/string.hpp>

using namespace std::string_view_literals;

constexpr std::array images = { "USERS.PNG"sv,"LESSONS.PNG"sv,"COURSES.PNG"sv,"ALUMNS.PNG"sv };
constexpr std::tuple sources = { BOOST_HANA_STRING("1"),BOOST_HANA_STRING("2"),BOOST_HANA_STRING("3"),BOOST_HANA_STRING("4") };

constexpr size_t image(const std::string_view& name)
{
    size_t i = 0;
    for (auto& image : images)
        if (image == name || !++i) break;

    return i;
}

template <size_t I>
constexpr auto source()
{
    return std::get<I>(sources);
}

//constexpr auto combined(const std::string_view& name)
//{
//    constexpr auto index = image(name);
//    return source<index>();
//}

int main()
{
    //constexpr auto hana_str = combined("LESSONS.PNG"sv);
    
    constexpr auto index = image("LESSONS.PNG"sv);
    constexpr auto hana_string = source<index>();

    static_assert(std::string_view(hana_string.c_str()) == "2"sv);
}

我想要的功能是在上面的代码中注释为“组合”。

解决方法

您可以将 boost::hana::string 传递给 combined(),以便在编译时使用 image() 调用 std::string_view

template <class CharT,CharT... s>
constexpr auto combined(const boost::hana::string<s...>& name)
{
   constexpr auto index = image(name.c_str());
   return source<index>();
}

这里是如何使用它:

using boost::hana::literals::operator""_s;
constexpr auto hana_str = combined("LESSONS.PNG"_s);
static_assert(hana_str.c_str() == "2"sv);

但是在包含 <boost/hana/string.hpp> 之前的 in order to enable boost::hana::literals::operator""_s you need to define BOOST_HANA_CONFIG_ENABLE_STRING_UDL

#define BOOST_HANA_CONFIG_ENABLE_STRING_UDL
#include <boost/hana/string.hpp>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?