[英]Specialize member function of a templated derived class
我有以下代碼(為了清楚起見,非常簡化):
class Base
{
virtual int DoStuff(int arg) = 0;
};
template <typename T>
class Derived : public Base
{
int DoStuff(int arg) override
{
// do some stuff
return 0;
}
};
這非常有效。 現在我想實現一個DoStuff的特殊(矢量化)實現。 我需要根據Derived的類型T來實現具體的實現,如下所示:
class Base
{
virtual int DoStuff(int arg) = 0;
virtual int DoStuffVectorized(int arg) = 0;
};
template <typename T>
class Derived : public Base
{
int DoStuff(int arg) override
{
// do some stuff
return 0;
}
int DoStuffVectorized<char>(int arg) override
{
// do some stuff for T == char
return 0;
}
int DoStuffVectorized<int>(int arg) override
{
// do some stuff for T == int
return 0;
}
};
但是我無法完成這項工作。
編輯:我收到以下錯誤消息:錯誤C2143:語法錯誤:缺少';' 在行上的'<'之前, int DoStuffVectorized<char>(int arg) override
。
當我將其更改為: template<char> int DoStuffVectorized(int arg) override
i get:error C2898:...':成員函數模板不能是虛擬的
關於如何實現這樣的事情的任何建議? 我需要它的原因是我有一個std :: vector存儲各種類型的數據(通過使用Derived <>)。 這樣我可以使用相同的簡單代碼,無論存儲的類型如何,即使使用DoStuff的特殊矢量化實現,我也希望這是真實的,這種實現很遺憾。
您必須在類之外專門化模板成員函數:
#include <iostream>
class Base
{
public:
virtual int DoStuffVectorized(int arg) = 0;
};
template <typename T>
class Derived : public Base
{
public:
int DoStuffVectorized(int arg) override;
};
template <>
int Derived<char>::DoStuffVectorized(int arg)
{
std::cout << "T == char\n";
return 0;
}
template <>
int Derived<int>::DoStuffVectorized(int arg)
{
std::cout << "T == int\n";
return 0;
}
int main(){
Derived<char> c;
Derived<int> i;
Base* b[] = { &c, &i };
for(auto* x : b)
x->DoStuffVectorized(0);
// undefined reference to `Derived<double>::DoStuffVectorized(int)'
// Derived<double> d;
}
如果要在編譯時捕獲非預期的實例化:
#include <type_traits>
// A std::false_type (useful in a static_assert)
template <typename T>
struct static_false : std::false_type
{};
template <typename T>
int Derived<T>::DoStuffVectorized(int arg)
{
static_assert(static_false<T>::value, "Neither 'char' or 'int'");
return 0;
}
DoStuffVectorized<char>
語法不正確, DoStuffVectorized
不是模板本身。
請參閱模板專業化 :
template <typename T>
class Derived : public Base
{
int DoStuff(int arg) override
{
// do some stuff
return 0;
}
int DoStuffVectorized(int arg) override
{
// do some stuff (primary template)
return 0;
}
};
template <>
int Derived<int>::DoStuffVectorized(int) {
// do some stuff for T == char
return 0;
}
template <>
int Derived<char>::DoStuffVectorized(int) {
// do some stuff for T == char
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.