簡體   English   中英

C ++ 11模板中的一個參數可以依賴於另一個嗎?

[英]Can one parameter in a C++11 template depend on another?

我的類SimRank有兩個浮點常量參數,C和D.我希望它們是靜態constexprs,而不是const實例成員。 但我也希望讓用戶選擇使用哪一種浮點的, float的大小或double的精度。

顯而易見的方法是這樣的:

template<typename FP, int _K, FP _C, FP _D>
class SimRank {
    static constexpr int K = _K;
    static constexpr FP C = _C;
    static constexpr FP D = _D;
};

template<int _K, float _C, float _D>
class SimRank<float> {};

template<int _K, double _C, double _D>
class SimRank<double> {};

int main() {
    SimRank<5, 0.8, 0> sd; // uses double
    SimRank<10, 0.6f, 0.05f> sf; // uses float
    return 0;
}

但是當我嘗試這個時,gcc會打印許多錯誤消息,所以顯然語法不存在。 我也做不了這樣的事情:

template<typename FP> template<int _K, FP _C, FP _D> class SimRank {...};

是否有任何語法可以讓我在編譯時指定K,C,D以及C和D的類型? 現在我已經選擇了const成員:

template<typename FP>
class SimRank {
private:
    const int K;
    const FP C;
    const FP D;
public:
    SimRank(int K, FP C, FP D) : K(K), C(C), D(D) {}
};

class SimRankF : public SimRank<float> {
public:
    SimRankF(int K, float C, float D) : SimRank<float>(K, C, D) {}
};

class SimRankD : public SimRank<double> {
public:
    SimRankD(int K, double C, double D) : SimRank<double>(K, C, D) {}
};

int main() {
    SimRankD sd(5, 0.8, 0.0);
    SimRankF sf(10, 0.6f, 0.05f);
    return 0;
}

(實際上,即使我必須保留const成員解決方案,我想要一種方法來定義SimRankF和SimRankD而不重復每個的構造函數。離開它會使gcc打印error: no matching function for call to 'SimRankF::SimRankF(int, float, float)'當我嘗試實例化一個SimRankF時。)

有兩個問題,

首先,模板非類型參數不能是float或double類型

其次,部分特化聲明的語法(及其在main中的使用)是錯誤的。

它與C ++ 11,BTW無關。

閱讀有關C ++模板的介紹性文本是最適合您的方法。

你不能使用:

template<typename FP, int _K, FP _C, FP _D>
class SimRank {
    static constexpr int K = _K;
    static constexpr FP C = _C;
    static constexpr FP D = _D;
};

FP的預期類型為floatdouble因為非類型模板參數不能是floatdouble

您可以使用您提出的解決方案:

template<typename FP>
class SimRank {
private:
    const int K;
    const FP C;
    const FP D;
public:
    SimRank(int K, FP C, FP D) : K(K), C(C), D(D) {}
};

目前尚不清楚如何使用K ,但您也可以使用:

template<typename FP, int K>
class SimRank {
private:
    const FP C;
    const FP D;
public:
    SimRank(FP C, FP D) : C(C), D(D) {}
};

並創建類的實例:

SimRank<double, 5> sd(0.8, 0.0);
SimRank<float, 10> sf(0.8f, 0.0f);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM