创建另一个函数模板,该模板设计为仅适用于uint8_t和/或int8_t,并将
dump
调用另一个函数模板。
或者,只需创建从函数模板调用的函数的重载
倾倒
。下面是一个示例,演示了它是如何工作的:
http://ideone.com/Z88DU6
我相信对你的代码这样做会像下面这样,但鉴于我从未使用过Objective-C(或Objective-C++),我并不完全肯定这一点。
// Note: I believe this works but am not a template wizard and have not tried
namespace {
using namespace Eigen;
using namespace std;
using namespace vMAT;
template <typename T>
inline Eigen::Map<Matrix<T, Dynamic, Dynamic>> get_printable_eigen(Eigen::Map<Matrix<T, Dynamic, Dynamic>> const& in)
{
return in;
}
// No specialization; simple overloads!
inline Eigen::Map<Matrix<int32_t, Dynamic, Dynamic>> get_printable_eigen(Eigen::Map<Matrix<int8_t, Dynamic, Dynamic>> const& in)
{
return in.cast<int32_t>();
}
inline Eigen::Map<Matrix<uint32_t, Dynamic, Dynamic>> get_printable_eigen(Eigen::Map<Matrix<uint8_t, Dynamic, Dynamic>> const& in)
{
return in.cast<uint32_t>();
}
template <typename T>
NSString *
dump(NSString * prefix, T * A, vMAT_Size sizeA)
{
NSMutableString * dump = [NSMutableString stringWithString:prefix];
[dump appendString:@" = \n"];
Eigen::Map<Matrix<T, Dynamic, Dynamic>> DATA(A, sizeA[0], sizeA[1]);
stringstream out;
out << get_printable_eigen(DATA) << endl;
[dump appendFormat:@"%s", out.str().c_str()];
return dump;
}
}
(可能还有其他解决方案使用
enable_if
和类型特征,但SFINAE应保留用于无法通过更简单的方法实现的情况,因为它会产生较差的错误消息)