[将函数成员有条件地添加到模板类中[重复]

问题描述 投票:2回答:2

我有一个定义为如下的类模板

template<typename T>
class A
{
  T t_;
  // void f();
};

我的问题是,仅当类型T为整数而没有编译错误时,才添加f()方法。

int main()
{
  A<int> a; // OK
  A<string> b; // OK
}

谢谢。

c++ templates sfinae
2个回答
0
投票

您可以使用部分专业化,如下所示

template<typename T>
class A
{
  T t_;
  // void f()
};

template<>
class A<int>
{
  int t_;
   void f(){}
};

0
投票

您可以使用type_traits和SFINAE启用特定功能:

#include <iostream>
#include <string>
#include <type_traits>

template<typename T>
class A
{
public:
    template<typename U = T, std::enable_if_t<std::is_integral_v<U>, int> = 0>
    void f() {
        std::cout << "int " << t_ << '\n';
    }
private:
    T t_;
};


int main() {
    A<int> a;
    a.f();

    A<std::string> s;
    // s.f(); //  error: no member named 'f' in 'A<std::__cxx11::basic_string<char> >'
}

如果您有许多整数特定的函数,则可以将它们放在自己的类中,并且仅当T是整数时才继承该类。

#include <iostream>
#include <string>
#include <type_traits>

template<typename Atype>
class int_functions {
public:
    Atype* This() { return static_cast<Atype*>(this); }

    void f() {
        std::cout << "int " << This()->t_ << '\n';
    }
};

template<typename Atype>
class non_int_functions {
};

template<typename T>
class A : public std::conditional_t<std::is_integral_v<T>, int_functions<A<T>>,
                                                           non_int_functions<A<T>>>
{
    friend std::conditional_t<std::is_integral_v<T>, int_functions<A<T>>,
                                                     non_int_functions<A<T>>>;
public:
private:
    T t_;
};
© www.soinside.com 2019 - 2024. All rights reserved.