T が特定のタイプではない場合、テンプレートの特殊化を記述することなくFoo()
、派生クラスでオーバーライドを無効にすることは可能でしょうか(または何らかのブースト マジックを使用) 。std::enable_if
class Derived
ボーナス ポイント: T が特定のメソッドを定義していない場合、オーバーライドを無効にできますか?
これが私のSSCCEです:
#include <iostream>
#include <string>
class Base
{
public:
virtual std::string Foo()
{
return "Base";
}
};
template <typename T>
class Derived : public Base
{
public:
virtual std::string Foo() override
{
return "Derived";
}
};
int main()
{
Derived<int> testInt;
std::cout << testInt.Foo() << std::endl;
Derived<float> testFloat;
std::cout << testFloat.Foo() << std::endl;//I would like this to print 'Base'
}
アップデート:
素晴らしい解決策をありがとう、しかし私はそれらを私の実際のコードに適応させることができませんでした. 次の例は、私が達成しようとしていることのより良いアイデアを提供するはずです:
#include <iostream>
#include <string>
class Object
{
public:
void Test()
{
std::cout << "Test" << std::endl;
}
};
class EmptyObject
{
};
class Base
{
public:
virtual std::string Foo()
{
return "Base";
}
};
template <typename T>
class Derived : public Base
{
public:
virtual std::string Foo() override
{
m_object.Test();
return "Derived";
}
private:
T m_object;
};
int main()
{
Derived<Object> testObject;
std::cout << testObject.Foo() << std::endl;
Derived<EmptyObject> testEmpty;
std::cout << testEmpty.Foo() << std::endl;
}