4
私は、ソースコードの以下の部分を知っているが、有効なC++コードではありませんが、ちょうど私の質問を説明するために:一般化された属性を持つ名前空間を作成する方法はありますか?
#include <iostream>
namespace mylib {
using deprecated = [[deprecated]];
}
[[mylib::deprecated]] void deprecated_function() {
std::cout << "Calling deprecated function!" << std::endl;
}
int main(void) {
deprecated_function();
return 0;
}
はそのようなことを実現する方法はありますか?コンパイラガードと検証を除いて、#define
を削除し、属性指定子を排他的に使用することが意図されています。これは、ある程度の前処理-fuの能力を要求します:)(ただし、predef is your friend)。例えば
:
// mylib-config.hpp
namespace mylib {
#if __cplusplus > 201402L // C++17 has support for [[deprecated]]
using deprecated = [[deprecated]]
#elif defined(__clang)
using deprecated = [[clang::deprecated]]
#elif defined(__GNUC__)
using deprecated = [[gnu::deprecated]]
#else // What to do? Is there a placeholder?
// Starting C++17, this invalid attribute should be ignored.
// Before that, the result is implementation-defined.
// (Is there any chance for undefined behaviour in this case?)
using deprecated = [[completely_invalid_identifier__]];
#endif
}
// mylib.hpp
[[mylib::deprecated]] void deprecated_function();
私の現在のソリューションは、属性は次のようになり#define
Sを、使用することです。例:
// mylib-config.hpp
#if __cplusplus > 201402L
#define mylib_DEPRECATED [[deprecated]]
#elif defined(__clang)
#define mylib_DEPRECATED [[clang::deprecated]]
#elif defined(__GNUC__)
#define mylib_DEPRECATED [[gnu::deprecated]]
#else
#define mylib_DEPRECATED
#endif
// mylib.hpp
mylib_DEPRECATED void deprecated_function();
の名前空間でアプリケーションによって使用されるすべての属性を正規化する場合あなた自身が確かに可能ですが、いくつかのコンパイラで特定の属性がないことをどのように説明しますか? (例えば、GCCのみに適用されるが、他のツールチェーン上では必要とされない属性)。
これはまさに私が今適用している解決策です。私は、標準で属性を文脈化することができるものを見落としているのかどうか疑問に思いました。それがそうであれば、属性指定子は現在のコンパイラ依存の属性を実際に改善するものではないと思います(少なくとも、ほとんどのコンパイラが未知の属性を無視したまともなC++ 17をサポートするまで)。ところで、委員会が "user-namespaced"属性指定子を追加する可能性はあると思いますか? –
@FlávioLisbôa:わかりませんが、(https://isocpp.org/forums)を見てください。たぶんそこに掲載されているグループのひとりで聞いてください。 –
@ cheers-and-hth-alfクール、私はそれを試してみましょう。ありがとう! –