Templates 让编译器针对特定的大小优化通用类(如模板)

Templates 让编译器针对特定的大小优化通用类(如模板),templates,c++11,optimization,Templates,C++11,Optimization,我编写了一个围绕任意大小矩阵的类。我现在的问题是,尽管我很难在标题中清楚地表达出来,但是否有某种方法可以让编译器创建一个额外的版本,比如说3X3或4X4矩阵,其中所有循环都将被优化掉。我的问题是非常时间关键的,因此如果有某种方法可以让编译器对那些流行情况下的矩阵函数进行简并,而不必以类似于模板方法的方式维护相同算法的3个版本,那将是令人惊讶的 如果有人能就这个问题给我一些建议,我会非常高兴,尽管我认为它不能完全作为一个模板来解决。您可以像Eigen对维度参数所做的那样:将它们作为一个模板参数,但

我编写了一个围绕任意大小矩阵的类。我现在的问题是,尽管我很难在标题中清楚地表达出来,但是否有某种方法可以让编译器创建一个额外的版本,比如说3X3或4X4矩阵,其中所有循环都将被优化掉。我的问题是非常时间关键的,因此如果有某种方法可以让编译器对那些流行情况下的矩阵函数进行简并,而不必以类似于模板方法的方式维护相同算法的3个版本,那将是令人惊讶的


如果有人能就这个问题给我一些建议,我会非常高兴,尽管我认为它不能完全作为一个模板来解决。

您可以像Eigen对维度参数所做的那样:将它们作为一个模板参数,但为动态提供的值提供一个特殊值:

template <int N> struct X
{
    X() : data{} {}

    static std::size_t size() { return N; }

    int data[N];

    void compute() { for (int : data) { /* ... */ } }
};

template <> struct X<-1>
{
    X(int n) : len(n), data(n) {}

    std::size_t size() const { return data.size(); }

    std::vector<int> data;

    void compute() { for (int : data) { /* ... */ } }
};
模板结构X
{
X():数据{}{}
静态std::size\u t size(){return N;}
int数据[N];
void compute(){for(int:data){/*…*/}
};
模板结构X
{
X(intn):len(n),data(n){}
std::size_t size()const{return data.size();}
std::矢量数据;
void compute(){for(int:data){/*…*/}
};
通用代码可以移动到基类模板或基类中,例如使用CRTP:

template <typename D>
struct Compute
{
    void compute()
    {
        D & d = static_cast<D &>(*this);
        for (int n : d.get_data()) { /* do stuff with n */ }
    }
};

template <int N> struct X : Base<X>
{
    // as above
};

template <> struct X<-1> : Base<X>
{
    // as above
};
模板
结构计算
{
void compute()
{
D&D=静态铸件(*本);
对于(int n:d.get_data()){/*使用n*/}
}
};
模板结构X:Base
{
//如上
};
模板结构X:Base
{
//如上
};

等等,为什么你要使用
int
并部分专门化
-1
而不是使用
size\u t
并提供第二个类(模板),适当命名?@Columbo:只是为了符号对称-所以你可以说
X,
X,
X
。没有深刻的原因。好吧,这太棒了,我以前不知道整数模板。我试着编译它,但我得到了初始化错误,所以我放弃了他们,它似乎工作正常,但我不能得到代码之间的类共享。我能想到的最简单的方法是使用预处理器makros将代码替换为两个函数,但这看起来很脏,或者是真的?@user5716904:您可以使用基类模板,就像在CRTP中一样。我加了一个例子。您要么需要有一个数据访问器,要么让基本模板成为朋友。