函数模板中的参数推导使用整数值作为模板参数

时间:2012-08-10 12:22:38

标签: c++ templates generic-programming

我正在尝试实现一个通用函数,该函数从id(std::string)生成std::pair<uint32_,uint32_t>

该功能如下:

typedef uint32_t element_type;

template <element_type type>
std::string to_string (const std::pair<element_type, uint32_t>& id) {
    ....
    const char* name = elemen_type_traits<type>::element_type_name;
    ...
}

我可以通过以下方式调用该函数:

std::cout << to_string<ELEMENT_TYPE_FOO> (foo_0) << std::endl;
std::cout << to_string<ELEMENT_TYPE_FOO> (foo_1) << std::endl;

唯一的问题是我想确保模板参数与std::pair的第一个字段匹配。是否可以从std::pair.first中扣除参数值?

我不知道是否可能,但最后我希望得到类似的东西:

std::cout << to_string (foo_0) << std::endl;
std::cout << to_string (foo_1) << std::endl;

提前致谢。

2 个答案:

答案 0 :(得分:3)

如果您对类型中的值进行编码,则实际上可以实现:

// C++11 'enum class' emulation, you don't want to leak 'foo' everywhere
// also called a "scoped enum"
struct element_type_value{
   enum type{
     foo = 1337
   };
};

template<element_type_value::type V>
struct element_type{};

template<element_type_value::type V>
std::string to_string(std::pair<element_type<V>, uint32_t> const& /*id*/){
  // ...
  const char* name = element_type_traits<V>::element_type_name;
  // ...
}

Live example.

当然,这仅在类型始终是静态已知值时才有效,实际上您甚至不再需要id.first。但是,据我所知,没有其他方法可以实现这项检查。

我个人可能会删除std::pair并只创建一个自定义结构,以及其他一些重构。

struct element_type{
   enum type{
     foo = 1337
   };
};

template<element_type::type V>
struct element_type_id{
  element_type_id(uint32_t id) : id(id){}
  uint32_t id; // or whatever your original std::pair::second represented
};

template<element_type::type V>
std::string to_string(element_type_id<V> const& /*id*/){
  // ...
  const char* name = element_type_traits<V>::element_type_name;
  // ...
}

Live example.

答案 1 :(得分:0)

如果我理解正确,你可以写:

std::string to_string (const std::pair<element_type, uint32_t>& id) {
 const element_type type = id.first;
 ....
 const char* name = elemen_type_traits<type>::element_type_name;
 ...
}