たとえば、次のクラスがあります。
class A
{
enum {N = 5};
double mVariable;
template<class T, int i>
void f(T& t)
{
g(mVariable); // call some function using mVariable.
f<T, i+1>(t); // go to next loop
}
template<class T>
void f<T, N>(T& t)
{} // stop loop when hit N.
};
関数テンプレートでは、部分的な特殊化は許可されていません。私の場合、どうすれば回避できますか?
Arne Mertzの例を次のように少し変更しました:
template<int n>
struct A
{
enum {N = n};
...
};
次のようにAを使用します。
A<5> a;
Visual Studio 2012でコンパイルできません。コンパイラのバグか何か他のものですか?なかなかおかしいです。
編集:チェック済み。これはVisualStudioのバグです。:(
Nimはそれを実装するための最も簡単な方法を提供すると思います。
c ++ 11のサポートにより、次のことができます。
#include <iostream>
#include <type_traits>
using namespace std;
struct A
{
enum {N = 5};
double mVariable;
void g(int i, double v)
{ std::cout << i << " " << v << std::endl; }
template<int i, class T>
typename enable_if<i >= N>::type f(T& t)
{} // stop loop when hit N.
template<int i, class T>
typename enable_if<i < N>::type f(T& t)
{
g(i, mVariable); // call some function using mVariable.
f<i+1, T>(t); // go to next loop
}
};
int main(void)
{
A a;
int v = 0;
a.f<0>(v);
}
私が好きな主な理由は、前の回答で要求されたようなくだらないものは必要ないということです...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加