【发布时间】:2014-04-04 11:02:50
【问题描述】:
有没有办法在整数模板类中对模板函数进行范围特化?经过大量研究后,我觉得答案可能只是“不”,但也许有一个巧妙的技巧或解决方法。
我尽可能简化我的课程来演示问题。
template<int value>
class MyClass
{
template <typename T, typename X>
uint64_t foo()
{
static_assert(sizeof(T) == 0, "Unsupported type combination.");
return 0;
}
uint64_t m_member;
};
到目前为止非常容易。非专业实现使用静态断言,因为我只希望模板函数用于某些类型。这些函数在类定义之外是专门的。
template<>
template<>
uint64_t MyClass<1>::foo<uint8_t, uint16_t>()
{
return m_member * 1000;
}
template<>
template<>
uint64_t MyClass<7>::foo<uint8_t, uint16_t>()
{
return m_member * 7000;
}
不,我正在寻找一种解决方案来将此专业化用于特定范围的 val。我希望 MyClass 抛出静态断言, MyClass, MyClass, ... , MyClass 应该使用 MyClass 最后 MyClass 必须使用第二个专业化。 foo 的其他特化工作不同。我有很多像 foo 这样的函数,并且都有大约 10 种类型组合在工作,而且它们的工作方式都非常不同。
最简单的解决方法是简单地复制专业,但我希望有更好的解决方案。如果 foo 可以保留为模板函数会很好,但我也可以使用定义所有可能的 foo 组合的解决方案,例如foo_u8_u16();, foo_u32_u64(), ...
【问题讨论】:
-
你能再解释一下吗?像
MyClass<1>::foo<int, double>();这样的东西呢?您是否打算将MyClass的某些专业化限制为仅foo的一个专业化? -
我确实需要像 MyClass::foo
(); 这样的东西。对单一专业化的限制意味着我根本不需要模板类函数。 -
那我不明白你为什么在你的例子中明确专门化
foo。所以,为了确认一下,MyClass<7>::foo<uint8_t, uint16_t>();和MyClass<7>::foo<int, double>()应该做同样的事情吗? -
你的问题很有道理。我编辑了问题以使其更清楚。如果允许,这两个专业会做不同的事情。如果 foo 是否是模板函数,可能的解决方案可能并不重要。关键是整数范围的函数特化。
标签: c++ template-specialization