ではありません。非型テンプレート引数には、私は次のコードを持っている定数式
#include <cstdlib>
#include <cstdio>
#include <atomic>
enum ATYPE { Undefined = 0, typeA, typeB, typeC };
template<ATYPE TYPE = Undefined>
struct Object
{
Object() { counter++; }
static std::atomic<int> counter;
};
template<ATYPE TYPE>
std::atomic<int> Object<TYPE>::counter(1);
template<ATYPE TYPE>
void test()
{
printf("in test\n");
Object<TYPE> o;
}
int main(int argc, char **argv)
{
test<typeA>();
printf("%d\n", Object<typeA>::counter.load());
Object<typeA>::counter.store(0);
for (int i = 0; i < sizeof(ATYPE); ++i) {
Object<static_cast<ATYPE>(i)>::counter.store(0);
}
return 0;
}
私は次のコマンドラインを使用してコンパイル:私は次のエラーを取得
clang++ -o test -std=c++11 -stdlib=libc++ test.cpp
:
test.cpp:32:20: error: non-type template argument is not a constant expression
Object<static_cast<ATYPE>(i)>::counter.store(0);
^~~~~~~~~~~~~~~~~~~~~
test.cpp:32:39: note: read of non-const variable 'i' is not allowed in a constant expression
Object<static_cast<ATYPE>(i)>::counter.store(0);
^
testray.cpp:31:18: note: declared here
for (int i = 0; i < sizeof(ATYPE); ++i) {
私は信じている問題を理解しています。テンプレートの引数はconstexprである必要があり、明らかにそうではありません。だから、問題は、私はこれを実現するために可能な変更が可能なのかどうかということです。
とてもエレガントで実用的ではないObject<Undefined>::counter.store(0);
Object<typeA>::counter.store(0);
...
:この作業では、私が意味する、私は何とかちょうどそれを手動で行うよりも、他のATYPEの各タイプについて、このテンプレートクラスからこれらの静的カウンタをリセットするより良い方法を持つことができますATYPEには多くの種類があります。
ご協力いただきありがとうございます。こんなもののために
とにかくあなたの列挙型を間違ってループしています。 'i'はエラーが示すように定数式ではありません。 – Rapptz
@Rapptz、最初のコメント(enumを間違って繰り返している)について詳しく説明してください。私は私がconstではないことを知っています。だから、どういうわけかこの仕事をする方法があるのかどうか尋ねているのです。列挙型のすべての要素をループしてカウンターをリセットする方法は何とかありますか?ありがとうございました。 – user18490
Rapptzとは、私が動的であり、コンパイル時のテンプレート引数として使用できないということです。 –