抱歉,我真的不知道如何打电话给我的问题,希望它适合......
我有一个函数模板,它将参数作为模板参数。对于该参数,我需要另一个模板参数来声明参数的类型,但是稍后调用该函数时,我想省略参数的类型。所以,我想有一些typedef(或其他机制)来摆脱它。
我已经看到了与其他模板类似的机制,例如
// 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,所以有没有办法让智能模板出现?
我使用gcc 4.8.1并启用了C ++ 11。
答案 0 :(得分: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";
}
这很乏味,但是这确实有利于编译时检查枚举是否与元组兼容。