1

簡単なコードを次に示します。

#include <iostream>
#include <fstream>

template<typename T>
class A {
    public:
        T _v;
        template<unsigned short V> void init() { _v *= V; }
        void print(double txt) { std::cout << "Initialized with ?? : " << txt << std::endl; }
};

int main() {
    A<double> foo;
    foo._v = 3.5;
    foo.init<2>();
    foo.print(foo._v);

    A<int> bar;
    bar._v = 2;
    bar.init<5>();
    foo.print(bar._v);
}

A::print(double)に依存する関数の実装が必要です。unsigned short Vたとえば、インスタンス化さ??れたunsigned shortfromに置き換えinit()ます。私の質問は次のとおりです。(a)それは実行可能ですか?(b) (a) の場合、どのように?

if (a) を検索しているときに、 にファンクターを追加し、class A<T>その状態を ( の値でV) で初期化しinit()、 で呼び出すことができると考えましたprint(double)が、そのようなオブジェクトを使用したことがないので、これが方法であるかどうかはわかりません行く。私は基本的にどんな提案にもオープンです。必要なのは への呼び出しがprint同じままであることだけです (. の値がわからない他のクラスから呼び出すため) unsigned short V

ありがとう !

4

1 に答える 1

0

一方通行:

template<typename T>
class A {
    public:
        T _v;
        unsigned short _v2;
        template<unsigned short V> void init() { _v2 = V;  _v *= V; }
        void print(double txt) { std::cout << "Initialized with "
            << _v2 << " : " << txt << std::endl; }
};

または、そうしない理由:

template<typename T, unsigned short V>
struct A {
        T _v = V;
        void print(double txt) { std::cout << "Initialized with "
            << V << " : " << txt << std::endl; }
};
于 2012-10-03T06:43:46.583 に答える