2

class特定の方法で関数を呼び出すために、純粋に構文上の目的で使用する があります。これは簡単な例です:

#include<iostream>

template<class T1>
struct make{
    template<class T2>
    static T1 from(T2 const& t2){
        return T1{}; //or something more complicated
    }
};

int main(){
    double d = make<double>::from(2);
    std::cout << d << '\n';
}

ここで、このクラスをインスタンス化してはならないことをユーザーに警告したいとします。クラスを不変にする用途があるかもしれませんが、それを禁止できるかどうか興味がありますか?

まず、デフォルトのコンストラクタを削除してみました

template<class T1>
struct make{
    make() = delete;
    template<class T2>
    static T1 from(T2 const& t2){
        return T1{}; //or something more complicated
    }
};

しかし、これはまだ可能です:

make<double> m{}; // valid

最後に、デストラクタを削除してみましたが、うまくいったようです

template<class T1>
struct make{
    ~make() = delete;
    template<class T2>
    static T1 from(T2 const& t2){
        return T1{}; //or something more complicated
    }
};

しかし、クラスはまだ によって割り当てられるようnewです。

デストラクタと削除コンストラクタの両方を削除する必要があります (コピーおよび移動コンストラクタはどうですか?)

これはインスタンス化を禁止する最良の方法ですか? コードはこちら: http://coliru.stacked-crooked.com/a/0299c377c129fffb

#include<iostream>

template<class T1>
struct make{
    make() = delete;
    ~make() = delete;
    template<class T2>
    static T1 from(T2 const& t2){
        return T1{}; //or something more complicated
    }
};

int main(){
    double d = make<double>::from(2);
    std::cout << d << '\n';
    make<double> m{}; // compile error (no destructor)
    auto p = new make<double>{}; // compile error (no constructor)
}
4

1 に答える 1