2016-09-28 12 views
9

コンパイル時に(実際にプログラムをコンパイルして実行する前に)その引数の値がわかっているか不明である場合のテンプレート関数を特化する方法はありますか?コンパイル時に変数の値がわかっているかどうか分からない場合

私はまだどのように把握できません。

アイデア1:

#include <type_traits> 
#include <iostream> 
int main(void){ 
    int a; //value of a is not known at compile time 
    bool b = (a == a); //value of b is known at compile time. 
    std::is_assignable< constexpr bool, bool >::value 
} 
//g++ magic.cpp -std=c++14 
//error: wrong number of template arguments (1, should be 2) 
// std::is_assignable< constexpr bool, bool >::value 

アイデア2:

#include <type_traits> 
#include <iostream> 
int main(void){ 
    const int a=1; 
    int b = (a == a); 
    std::cout << __builtin_constant_p (a) << std::endl; 
    std::cout << __builtin_constant_p (b) << std::endl; 
} 
//prints 0 and 0. 
+2

なぜdownvote? "これはできません"は受け入れられる答えです。 –

+0

私があなたを正しく理解していれば、これはconstexprのオーバーロードを必要とします。 - [できません。](@stackoverflow.com/a/33192804/1968) –

+0

@Konrad Rudolph。その答えを正しく読めば、関数は 'constexpr'引数を持つことができないと言います。私は 'constexpr'を再定義するのではなく、特性による専門化について考えています。 –

答えて

1

まあ、私は右、あなたが引数のタイプ意味を推測しますか?値は部分テンプレートの特殊化には関係ありません。

Then:これはできません。

テンプレートのパラメータタイプは、コンパイル時に認識されている必要があります。コンパイラが正しいコードをどのように生成する必要がありますか?

また、部分テンプレートの特殊化では、同じ理由で型をコンパイル時に認識する必要があります。

+0

。コンパイル時に「パラメータは既知/未知のコンパイル時」となっています。私は次のことが可能かどうかを知りたがっています:(コンパイル時に)パラメータが分かっている場合は、テンプレートをバージョンAとして特化します。それ以外の場合は、テンプレートをバージョンBとして特化してください。 –

+0

コンパイル時にパラメータの型が不明であるシナリオを想像するのに問題があります。ソースコードの例を提供してください。 – Rene

+0

タイプについてはありません。それは価値です。 'int a;'だけでは値を指定しません。 'constexpr int a = 6;'はコンパイル時に知られている値を指定します。 'int a; bool b =(a == a); '、' b'の値はコンパイル時に知られています。 –

関連する問題