模板特化行为示例

时间:2015-08-11 01:13:06

标签: c++ generics polymorphism

我正在尝试理解C ++中的模板专业化。我已阅读其他论坛,但无法让它在实践中发挥作用。我想用一个非常简单的例子来学习,我将解释。

我想要完成的任务:我希望foo根据类型展示不同的行为。下面的代码不起作用,但我已经评论了我希望看到的行为。请有人请填写我评论过的内容。 如果有任何不清楚的地方,请告诉我。

#include <iostream>
#include <string>

template <typename T>
class my_template 
{
public:
    foo() {return 0} // default behavior if there does not exist foo() function for the specified type 
};

template <>
class my_template<int> 
{
public:
    // implement foo function: should return -1 if the type = int 
};

template <>
class my_template<long>
{
public:
    // implement foo function: should return 100 if the type = long 
};

int main() 
{
    my_template<int> x;
    my_template<long> y;
    my_template<double> z;
    std::cout << x.foo() << "\n"; // print -1 
    std::cout << y.foo() << "\n"; // print 100 
    std::cout << z.foo() << "\n"; // print 0
    return 0;
}

2 个答案:

答案 0 :(得分:2)

只是为了向您展示一些不同的方法。

如果你使用元函数方法,那么在运行时就不会做任何事情(保证):

template<typename>
struct my_template{
    enum { value = 0 };
};

template<>
struct my_template<int>{
    enum { value = -1 };
};

template<>
struct my_template<long>{
    enum { value = 100 };
};

int main(){
    std::cout << "float:  " << my_template<float>::value << '\n';
    std::cout << "int:    " << my_template<int>::value << '\n';
    std::cout << "long:   " << my_template<long>::value << '\n'; 
}

或者您可以使用模板变量(C ++ 14):

template<typename>
constexpr int my_value = 0;

template<>
constexpr int my_value<int> = -1;

template<>
constexpr int my_value<long> = 100;

int main(){
    std::cout << "float:  " << my_value<float> << '\n';
    std::cout << "int:    " << my_value<int> << '\n';
    std::cout << "long:   " << my_value<long> << '\n';
}

或使用模板功能:

template<typename T> 
int func_impl(T){ return 0; }
int func_impl(int){ return -1; }
int func_impl(long){ return 100; }

template<typename T>
int func(){
    return func_impl(T(0));
}

int main(){
    std::cout << "float:  " << func<float>() << '\n';
    std::cout << "int:    " << func<int>() << '\n';
    std::cout << "long:   " << func<long>() << '\n';
}

答案 1 :(得分:1)

template <typename T>
class my_template 
{
public:
  int foo() {return 0;} // default behavior 
};

template <>
class my_template<int> 
{
public:
  int foo() {return -1;}
};

那够了吗?