2017-07-09 6 views
0

thisによると、div、ldiv、lldivがテンプレートでないのはなぜですか?

std::div_t  div(int x, int y); 
std::ldiv_t div(long x, long y); 
std::lldiv_t div(long long x, long long y); 
std::ldiv_t ldiv(long x, long y); 
std::lldiv_t lldiv(long long x, long long y); 

2のdivが<cinttypes>

である私が

template<typename t> 
std::div_t<T> div(T x, T y); 
template<> 
std::div<int> div(int x, int x) 
{ 
    // implementation here 
} 

思考を見ていることを好むでしょうか?

+2

最終 'のstd :: div要素は' 'べきであるのstd :: div_t '、右? – Ssswift

+0

私が実際に邪魔しているのは、これらの関数が存在するということです - はい、除算とモジュロはハードウェアレベルで一緒に計算されることが多いですが、私が知っているほとんどすべての実稼働準備済みコンパイラは既にこの事実を悪用し、 Cコードは、除算とモジュロの両方を実行します。 –

+0

@MatteoItalia: "*私が知っているほとんどすべての実稼働準備済みコンパイラ*" 20年前から "実稼動可能なコンパイラ"のステータスを知っていますか?これらはC++ 98関数であるためです。コンパイラの品質はかなり異なっていたと私は考えています。 –

答えて

1

あなたはオーバーロードの代わりにテンプレートの特殊化を使用したいと思っていますか?それは良い考えではありません。

まず、変換演算子を持つ型をlongに使用するとどうなりますか?まあ、専門分野はどれも選択されません。なぜなら、正確に一致するものがあるときだけ撮影され、そのタイプはそれらの一部ではないからです。だから私はstatic_castを使用しなければならない。このような変換が許可され、実行されるオペレータのオーバーロードでは、これは当てはまりません。

第2に、このような特化によってどのような利点が得られますか?各専門分野ごとに同じ実装を作成する必要があります。また、ソースファイルに実装を簡単に記述することもできません。

私が見ることができる唯一の利点は、適切なオーバーロードにstatic_castの代わりに&std::div<int>を行うテンプレートのように、特定のバージョンの関数のアドレスを取る方がはるかに簡単であるということです。

これらの機能の間にいくつかの重複が存在するため、一般的な解決策がはるかに適切です。たぶん、このような何か:

template<typename T> 
concept Integral = std::is_integral_v<T>; 

Integral{T} struct cdiv_t final { 
    T quot{}; 
    T rem{}; 
}; 

constexpr cdiv_t<Integral> cdiv(Integral x, Integral y) noexcept { 
    return{x/y, x % y}; 
} 
+0

ありがとうございます。 –

+0

'concept bool'は時代遅れです。単に 'concept'を使用してください。 – Yakk

+0

@Yakk Nice!情報をありがとう – Rakete1111

関連する問題