Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于int8和uint8,专门化此模板函数的更好方法是什么?_C++_Templates_Template Specialization_Vmat - Fatal编程技术网

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;
    }
}