【发布时间】:2013-07-11 17:29:56
【问题描述】:
标题有点模糊。
假设我有一个模板定义为:
template < typename T >
void foo ( int x ) ;
template <>
void foo<char> ( int x ) ;
template <>
void foo<unsigned char> ( int x ) ;
template <>
void foo<short> ( int x ) ;
...
在内部,foo<signed>() 和 foo<unsigned>() 都做同样的事情。唯一的要求是T 是 8 位类型。
我可以通过创建另一个模板来键入基于大小定义标准类型来做到这一点。
template < typename T, size_t N = sizeof( T ) > struct remap ;
template < typename T, size_t > struct remap< 1 >
{
typedef unsigned char value;
}
...
注意,函数模板不能有默认参数。此解决方案只会将问题重新定位到另一个模板,如果有人尝试将结构类型作为参数传递,也会引入问题。
在不重复这些函数声明的情况下解决这个问题的最优雅的方法是什么?
这不是 C++11 问题。
【问题讨论】:
-
您是否尝试过使用 enable_if 来检查类型的大小?我假设你对所有相同大小的内置类型都做同样的事情?
-
@Borgleader enable_if 是 C++11
-
SFINAE 和
enable_if也可以在 C++03 中实现。 -
@DyP 我无法访问完整的 C++11,所以我从未使用过 enable_if。它将如何解决这个问题?
-
如果我理解正确,您希望避免代码重复。我看到的最简单的方法是从
foo<signed>和foo<unsigned>内部调用相同的函数。还有其他类似于您的remap建议的方法,但我认为您最终会使用更多代码来避免重复。