1

func特殊化がMyClassのすべてのインスタンスを処理するように、関数を特殊化またはオーバーロードするにはどうすればよいですか?たとえばfunc、ライブラリアン関数であると仮定すると、変更することも、置き換えることもラップすることもできず、特殊化する必要があります。std::swapfunc

#include <iostream>

template<typename T>
class MyClass
{
};

template<typename T>
void func(const T&)
{
    std::cout << "Default" << std::endl;
}

// I don't want to copy this stuff for every instance of MyClass
template<>
void func<MyClass<int>>(const MyClass<int>&)
{
    std::cout << "Specialization" << std::endl;
}

int main(int, char**)
{
    func(int(0)); // "Default"

    func(MyClass<int>()); // "Specialization"

    func(MyClass<double>()); // "Default" but I want "Specialization" here

    return 0;
}
4

2 に答える 2

2

できることのいくつかの例を次に示します。

template<typename T>
void func(const T&)
{
    std::cout << "Default" << std::endl;
}

template<template<typename> class A , typename B>
void func(const A<B>&)
{
    std::cout << "Overload All templated classes with one templated argument B" << std::endl;
}

template<typename T>
void func(const MyClass<T>&)
{
    std::cout << "Overload Myclass with some templated argument T" << std::endl;
}
于 2012-10-15T09:08:39.060 に答える
0

とにかくグローバルを変更できずfunc、それでも一方向のコピーを避けたい場合は、マクロを使用して反復的なものを自動化することです。

#define Specialize(TYPE) \
template<> \
void func<MyClass<TYPE>>(const MyClass<TYPE>&) \
{ \
    std::cout << "Specialization" << std::endl; \
}

Specialize(int);
Specialize(double);

変更する自由がある場合はMyClass<T>、のすべての一般的な機能をMyClass<T>一般的な非テンプレート基本クラスに配置します。

template<typename T>
class MyClass<T> : public MyClassBase // <---- a common base class
...

そして、単にオーバーロードするか、以下func()にのみ特化しMyClassBaseます:

void func(const MyClassBase&)
{
    std::cout << "Specialization" << std::endl;
}
于 2012-10-15T09:00:04.347 に答える