启用和访问模板方法

Enabling and accessing template method

本文关键字:模板方法 访问 启用      更新时间:2023-10-16

在以下代码中:

#include<iostream>
#include<cstdlib>
#include<type_traits>
using std::enable_if;
using std::is_same;
using std::cout;
using std::endl;
template<typename T>
struct S{
        S(){t = static_cast<T>(NULL);}
        template<typename U,typename enable_if<is_same<T,U>::value>::type>void operator()(U&& rrU){t = rrU;}
        T t;
};
int main(){
        S<int> s;
        return(0);
}

main()中的模板结构实例化之后,如何在模板结构中定义并使用operator()模板方法?

我必须承认我不太确定您要实现的目标,但是 type 将是 defuced 汇编,因此您不必担心。无论如何,我将按照以下方式实施您的示例(这是基于我对您的意图的理解(:

/** @file: test.cpp */
#include <utility>
#include <type_traits>
template <typename T>
struct S {
  S() : t(0)  { };
  template <typename U>
  void operator()(U &&rrU) {
    static_assert(std::is_same<T,U>::value, "typename U must be equal to typename T"); 
    t = rrU; 
  }
  T t;
};
int main() {
  S<int> s;
  int a = 10;
  s(std::move(a));
#ifdef RAISES_ERROR
  double b = 10.0;
  s(std::move(b));
#endif
  return (0);
}

这可以通过两种方式进行编译:

g++ -std=c++11 test.cpp

编译罚款,第二种情况提出了汇编错误(这是您想要的吗?(,但是可以使错误自我解释:

g++ -std=c++11 -DRAISES_ERROR test.cpp
test.cpp: In instantiation of ‘void S<T>::operator()(U&&) [with U = double; T = int]’:
test.cpp:26:17:   required from here
test.cpp:12:5: error: static assertion failed: Error
     static_assert(std::is_same<T,U>::value, "typename U must be equal to typename T");
     ^