C++ 对于int8和uint8,专门化此模板函数的更好方法是什么?
考虑下面的模板C++ 对于int8和uint8,专门化此模板函数的更好方法是什么?,c++,templates,template-specialization,vmat,C++,Templates,Template Specialization,Vmat,考虑下面的模板dump功能: namespace { using namespace Eigen; using namespace std; using namespace vMAT; template <typename T> NSString * dump(NSString * prefix, T * A, vMAT_Size sizeA) { NSMutableString * dump = [NSMu
dump
功能:
namespace {
using namespace Eigen;
using namespace std;
using namespace vMAT;
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 << DATA << endl;
[dump appendFormat:@"%s", out.str().c_str()];
return dump;
}
template <> // Specialized so elements print as numbers instead of chars
NSString *
dump(NSString * prefix, int8_t * A, vMAT_Size sizeA)
{
NSMutableString * dump = [NSMutableString stringWithString:prefix];
[dump appendString:@" = \n"];
Eigen::Map<Matrix<int8_t, Dynamic, Dynamic>> DATA(A, sizeA[0], sizeA[1]);
stringstream out;
out << DATA.cast<int32_t>() << endl;
[dump appendFormat:@"%s", out.str().c_str()];
return dump;
}
template <> // Specialized so elements print as numbers instead of chars
NSString *
dump(NSString * prefix, uint8_t * A, vMAT_Size sizeA)
{
NSMutableString * dump = [NSMutableString stringWithString:prefix];
[dump appendString:@" = \n"];
Eigen::Map<Matrix<uint8_t, Dynamic, Dynamic>> DATA(A, sizeA[0], sizeA[1]);
stringstream out;
out << DATA.cast<uint32_t>() << endl;
[dump appendFormat:@"%s", out.str().c_str()];
return dump;
}
}
Xcode抱怨cast()
是一个“依赖模板”,并希望在其前面插入template
关键字……这似乎是一种无意义的语法,然后会生成另一个编译器错误
为int8_t和uint8_t专门化此模板函数的更好方法是什么?创建另一个仅用于uint8_t和/或int8_t的函数模板,并让您的
dump
专门化调用该其他函数模板
或者,只需创建从函数模板dump
调用的函数重载即可。下面是一个示例,演示了该方法的工作原理:
我相信对你的代码这样做会像下面这样,但我并不完全肯定这是可行的,因为我从未使用过Objective-C(或Objective-C++)
//注意:我相信这是可行的,但我不是模板向导,也没有尝试过
名称空间{
使用名称空间特征;
使用名称空间std;
使用名称空间vMAT;
模板
内联特征::映射获取可打印特征(特征::映射常量(&in)
{
返回;
}
//没有专门化;简单重载!
内联特征::映射获取可打印特征(特征::映射常量(&in)
{
返回.cast();
}
内联特征::映射获取可打印特征(特征::映射常量(&in)
{
返回.cast();
}
模板
NSString*
转储(NSString*前缀、T*A、vMAT_大小sizeA)
{
NSMutableString*dump=[nsmutablestringwithstring:prefix];
[转储附件字符串:@“=\n”];
特征::映射数据(A,sizeA[0],sizeA[1]);
流出来;
out创建另一个函数模板,该模板仅用于uint8和/或int8,并让您的dump
专业人员调用该其他函数模板
或者,只需创建从函数模板dump
调用的函数的重载即可。下面是一个示例,演示如何工作:
我相信对你的代码这样做会像下面这样,但我并不完全肯定这是可行的,因为我从未使用过Objective-C(或Objective-C++)
//注意:我相信这是可行的,但我不是模板向导,也没有尝试过
名称空间{
使用名称空间特征;
使用名称空间std;
使用名称空间vMAT;
模板
内联特征::映射获取可打印特征(特征::映射常量(&in)
{
返回;
}
//没有专门化;简单重载!
内联特征::映射获取可打印特征(特征::映射常量(&in)
{
返回.cast();
}
内联特征::映射获取可打印特征(特征::映射常量(&in)
{
返回.cast();
}
模板
NSString*
转储(NSString*前缀、T*A、vMAT_大小sizeA)
{
NSMutableString*dump=[nsmutablestringwithstring:prefix];
[转储附件字符串:@“=\n”];
特征::映射数据(A,sizeA[0],sizeA[1]);
流出来;
在你的第二个注释中,它认为“cast”是一个类模板,而不是函数模板。你是如何得到“AsT”的?(虽然这似乎是一个单独的问题)@BillyONeal:我正在尝试添加AsT
作为第二个模板参数。在你的第二个注释中,它认为“cast”是一个类模板,而不是函数模板。你是如何得到“AsT”的?(虽然这似乎是一个单独的问题)@BillyONeal:我正在尝试将AsT
添加为第二个模板参数。很好…使用了上面的一个细微变化。谢谢!很好…使用了上面的一个细微变化。谢谢!
out << DATA.cast<AsT>() << endl;
// 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;
}
}