gpt4 book ai didi

c++ - 函数模板的 typedef(部分实例化)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:02 24 4
gpt4 key购买 nike

抱歉,我真的不知道如何称呼我的问题,希望它适合...

我有一个函数模板,它获取一个参数作为模板参数。对于该参数,我需要另一个模板参数来声明参数的类型,但在稍后调用该函数时,我想省略参数的类型。所以,我想要某种类型定义(或其他机制)来摆脱它。

我在其他模板中看到了类似的机制,例如

// given: rule is a template with three arguments
template<typename Attr> using Rule = rule<It, Attr(), Skipper>;

当使用 std::get 时,无需直接提及枚举类就可以相处:

std::get<static_cast<std::size_t>(Enum::type1)>(tuple);

这是函数,它用于访问带有枚举的元组(比较:https://stackoverflow.com/a/14835597/2524462)

template<typename Enum, Enum enum, class ... Types>
typename std::tuple_element<static_cast<std::size_t>(enum), std::tuple<Types...> >::type&
get(std::tuple<Types...>& t) {
return std::get<static_cast<std::size_t>(enum)>(t);
}

因为它将与多个枚举一起使用,所以我不想像他那样在模板中硬连线枚举。

它被称为:(1)

std::cout << get<myEnum, myEnum::type1>(tuple);

问题:

  • 我可以使用 typedef 或类似的方式来调用它吗:

    std::cout << new_get < myEnum::type1 > (tuple);
  • 既然它与 std::get 一起工作,首先有没有办法拥有一个更智能的模板?

  • 此处的获取模板将元组类型作为最后一个参数。为什么没有必要在这里把它们拼出来 (1)?编译器如何从给定的参数中找出它们?

我正在使用启用了 C++11 的 gcc 4.8.1。

最佳答案

我认为你能做的最好的事情就是创建一个 get<>()每个枚举的函数。这是一个例子:

#include <tuple>
#include <string>
#include <iostream>

typedef std::tuple<std::string,std::string> Tuple1;
typedef std::tuple<std::string,int> Tuple2;

enum class Enum1 {
name,
address
};

enum class Enum2 {
state,
zip_code
};

template <typename Enum>
constexpr std::size_t indexOf(Enum value)
{
return static_cast<std::size_t>(value);
}

template <typename Enum,Enum enum_value,typename Tuple>
constexpr auto get(const Tuple &value)
-> decltype(std::get<indexOf(enum_value)>(value))
{
return std::get<indexOf(enum_value)>(value);
}

template <Enum1 enum_value>
constexpr auto get(const Tuple1 &value)
-> decltype(get<Enum1,enum_value>(value))
{
return get<Enum1,enum_value>(value);
}

template <Enum2 enum_value>
constexpr auto get(const Tuple2 &value)
-> decltype(get<Enum2,enum_value>(value))
{
return get<Enum2,enum_value>(value);
}

int main(int,char**)
{
Tuple1 a("John","123 Foo St");
Tuple2 b("California",90210);
std::cerr << get<Enum1::name>(a) << "\n";
std::cerr << get<Enum1::address>(a) << "\n";
std::cerr << get<Enum2::state>(b) << "\n";
std::cerr << get<Enum2::zip_code>(b) << "\n";
}

这很乏味,但是这确实有利于编译时检查枚举是否与元组兼容。

关于c++ - 函数模板的 typedef(部分实例化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17747842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com